Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
fc73697b
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
fc73697b
编写于
8月 04, 2010
作者:
J
Jiri Kosina
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'upstream' into for-linus
Conflicts: drivers/hid/hid-ids.h
上级
1c5474a6
8c8b01c3
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
276 addition
and
74 deletion
+276
-74
drivers/hid/Kconfig
drivers/hid/Kconfig
+6
-0
drivers/hid/Makefile
drivers/hid/Makefile
+1
-0
drivers/hid/hid-core.c
drivers/hid/hid-core.c
+1
-0
drivers/hid/hid-elecom.c
drivers/hid/hid-elecom.c
+57
-0
drivers/hid/hid-ids.h
drivers/hid/hid-ids.h
+42
-39
drivers/hid/hid-input.c
drivers/hid/hid-input.c
+3
-0
drivers/hid/hid-picolcd.c
drivers/hid/hid-picolcd.c
+166
-33
drivers/hid/hidraw.c
drivers/hid/hidraw.c
+0
-2
未找到文件。
drivers/hid/Kconfig
浏览文件 @
fc73697b
...
...
@@ -148,6 +148,12 @@ config HID_EGALAX
---help---
Support for the eGalax dual-touch panel.
config HID_ELECOM
tristate "ELECOM"
depends on BT_HIDP
---help---
Support for the ELECOM BM084 (bluetooth mouse).
config HID_EZKEY
tristate "Ezkey" if EMBEDDED
depends on USB_HID
...
...
drivers/hid/Makefile
浏览文件 @
fc73697b
...
...
@@ -32,6 +32,7 @@ obj-$(CONFIG_HID_CHICONY) += hid-chicony.o
obj-$(CONFIG_HID_CYPRESS)
+=
hid-cypress.o
obj-$(CONFIG_HID_DRAGONRISE)
+=
hid-drff.o
obj-$(CONFIG_HID_EGALAX)
+=
hid-egalax.o
obj-$(CONFIG_HID_ELECOM)
+=
hid-elecom.o
obj-$(CONFIG_HID_EZKEY)
+=
hid-ezkey.o
obj-$(CONFIG_HID_GYRATION)
+=
hid-gyration.o
obj-$(CONFIG_HID_KENSINGTON)
+=
hid-kensington.o
...
...
drivers/hid/hid-core.c
浏览文件 @
fc73697b
...
...
@@ -1294,6 +1294,7 @@ static const struct hid_device_id hid_blacklist[] = {
{
HID_USB_DEVICE
(
USB_VENDOR_ID_CYPRESS
,
USB_DEVICE_ID_CYPRESS_MOUSE
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_DRAGONRISE
,
0x0006
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_DWAV
,
USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH
)
},
{
HID_BLUETOOTH_DEVICE
(
USB_VENDOR_ID_ELECOM
,
USB_DEVICE_ID_ELECOM_BM084
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_EZKEY
,
USB_DEVICE_ID_BTC_8193
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_GAMERON
,
USB_DEVICE_ID_GAMERON_DUAL_PSX_ADAPTOR
)
},
{
HID_USB_DEVICE
(
USB_VENDOR_ID_GAMERON
,
USB_DEVICE_ID_GAMERON_DUAL_PCS_ADAPTOR
)
},
...
...
drivers/hid/hid-elecom.c
0 → 100644
浏览文件 @
fc73697b
/*
* HID driver for Elecom BM084 (bluetooth mouse).
* Removes a non-existing horizontal wheel from
* the HID descriptor.
* (This module is based on "hid-ortek".)
*
* Copyright (c) 2010 Richard Nauber <Richard.Nauber@gmail.com>
*/
/*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*/
#include <linux/device.h>
#include <linux/hid.h>
#include <linux/module.h>
#include "hid-ids.h"
static
void
elecom_report_fixup
(
struct
hid_device
*
hdev
,
__u8
*
rdesc
,
unsigned
int
rsize
)
{
if
(
rsize
>=
48
&&
rdesc
[
46
]
==
0x05
&&
rdesc
[
47
]
==
0x0c
)
{
dev_info
(
&
hdev
->
dev
,
"Fixing up Elecom BM084 "
"report descriptor.
\n
"
);
rdesc
[
47
]
=
0x00
;
}
}
static
const
struct
hid_device_id
elecom_devices
[]
=
{
{
HID_BLUETOOTH_DEVICE
(
USB_VENDOR_ID_ELECOM
,
USB_DEVICE_ID_ELECOM_BM084
)},
{
}
};
MODULE_DEVICE_TABLE
(
hid
,
elecom_devices
);
static
struct
hid_driver
elecom_driver
=
{
.
name
=
"elecom"
,
.
id_table
=
elecom_devices
,
.
report_fixup
=
elecom_report_fixup
};
static
int
__init
elecom_init
(
void
)
{
return
hid_register_driver
(
&
elecom_driver
);
}
static
void
__exit
elecom_exit
(
void
)
{
hid_unregister_driver
(
&
elecom_driver
);
}
module_init
(
elecom_init
);
module_exit
(
elecom_exit
);
MODULE_LICENSE
(
"GPL"
);
drivers/hid/hid-ids.h
浏览文件 @
fc73697b
...
...
@@ -34,7 +34,7 @@
#define USB_DEVICE_ID_ACECAD_FLAIR 0x0004
#define USB_DEVICE_ID_ACECAD_302 0x0008
#define USB_VENDOR_ID_ADS_TECH
0x06e1
#define USB_VENDOR_ID_ADS_TECH 0x06e1
#define USB_DEVICE_ID_ADS_TECH_RADIO_SI470X 0xa155
#define USB_VENDOR_ID_AFATECH 0x15a4
...
...
@@ -81,12 +81,12 @@
#define USB_DEVICE_ID_APPLE_WELLSPRING_ANSI 0x0223
#define USB_DEVICE_ID_APPLE_WELLSPRING_ISO 0x0224
#define USB_DEVICE_ID_APPLE_WELLSPRING_JIS 0x0225
#define USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI
0x0229
#define USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO
0x022a
#define USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS
0x022b
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI
0x022c
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO
0x022d
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS
0x022e
#define USB_DEVICE_ID_APPLE_GEYSER4_HF_ANSI
0x0229
#define USB_DEVICE_ID_APPLE_GEYSER4_HF_ISO
0x022a
#define USB_DEVICE_ID_APPLE_GEYSER4_HF_JIS
0x022b
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_ANSI
0x022c
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_ISO
0x022d
#define USB_DEVICE_ID_APPLE_ALU_WIRELESS_JIS
0x022e
#define USB_DEVICE_ID_APPLE_WELLSPRING2_ANSI 0x0230
#define USB_DEVICE_ID_APPLE_WELLSPRING2_ISO 0x0231
#define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS 0x0232
...
...
@@ -118,8 +118,8 @@
#define USB_VENDOR_ID_AVERMEDIA 0x07ca
#define USB_DEVICE_ID_AVER_FM_MR800 0xb800
#define USB_VENDOR_ID_BELKIN
0x050d
#define USB_DEVICE_ID_FLIP_KVM
0x3201
#define USB_VENDOR_ID_BELKIN
0x050d
#define USB_DEVICE_ID_FLIP_KVM
0x3201
#define USB_VENDOR_ID_BERKSHIRE 0x0c98
#define USB_DEVICE_ID_BERKSHIRE_PCWD 0x1140
...
...
@@ -128,7 +128,7 @@
#define USB_DEVICE_ID_BTC_EMPREX_REMOTE 0x5578
#define USB_VENDOR_ID_CANDO 0x2087
#define USB_DEVICE_ID_CANDO_MULTI_TOUCH
0x0a01
#define USB_DEVICE_ID_CANDO_MULTI_TOUCH
0x0a01
#define USB_DEVICE_ID_CANDO_MULTI_TOUCH_11_6 0x0b03
#define USB_VENDOR_ID_CH 0x068e
...
...
@@ -175,7 +175,7 @@
#define USB_DEVICE_ID_DEALEXTREAME_RADIO_SI4701 0x819a
#define USB_VENDOR_ID_DELORME 0x1163
#define USB_DEVICE_ID_DELORME_EARTHMATE
0x0100
#define USB_DEVICE_ID_DELORME_EARTHMATE
0x0100
#define USB_DEVICE_ID_DELORME_EM_LT20 0x0200
#define USB_VENDOR_ID_DMI 0x0c0b
...
...
@@ -187,19 +187,22 @@
#define USB_DEVICE_ID_EGALAX_TOUCHCONTROLLER 0x0001
#define USB_DEVICE_ID_DWAV_EGALAX_MULTITOUCH 0x480d
#define USB_VENDOR_ID_ELECOM 0x056e
#define USB_DEVICE_ID_ELECOM_BM084 0x0061
#define USB_VENDOR_ID_ELO 0x04E7
#define USB_DEVICE_ID_ELO_TS2700 0x0020
#define USB_VENDOR_ID_ESSENTIAL_REALITY 0x0d7f
#define USB_DEVICE_ID_ESSENTIAL_REALITY_P5 0x0100
#define USB_VENDOR_ID_ETURBOTOUCH 0x22b9
#define USB_DEVICE_ID_ETURBOTOUCH 0x0006
#define USB_VENDOR_ID_ETT 0x0664
#define USB_DEVICE_ID_TC5UH 0x0309
#define USB_VENDOR_ID_EZKEY 0x0518
#define USB_VENDOR_ID_ETURBOTOUCH 0x22b9
#define USB_DEVICE_ID_ETURBOTOUCH 0x0006
#define USB_VENDOR_ID_EZKEY 0x0518
#define USB_DEVICE_ID_BTC_8193 0x0002
#define USB_VENDOR_ID_GAMERON 0x0810
...
...
@@ -296,9 +299,16 @@
#define USB_VENDOR_ID_KBGEAR 0x084e
#define USB_DEVICE_ID_KBGEAR_JAMSTUDIO 0x1001
#define USB_VENDOR_ID_KENSINGTON 0x047d
#define USB_DEVICE_ID_KS_SLIMBLADE 0x2041
#define USB_VENDOR_ID_KWORLD 0x1b80
#define USB_DEVICE_ID_KWORLD_RADIO_FM700 0xd700
#define USB_VENDOR_ID_KYE 0x0458
#define USB_DEVICE_ID_KYE_ERGO_525V 0x0087
#define USB_DEVICE_ID_KYE_GPEN_560 0x5003
#define USB_VENDOR_ID_LABTEC 0x1020
#define USB_DEVICE_ID_LABTEC_WIRELESS_KEYBOARD 0x0006
...
...
@@ -318,9 +328,6 @@
#define USB_DEVICE_ID_LD_POWERCONTROL 0x2030
#define USB_DEVICE_ID_LD_MACHINETEST 0x2040
#define USB_VENDOR_ID_KENSINGTON 0x047d
#define USB_DEVICE_ID_KS_SLIMBLADE 0x2041
#define USB_VENDOR_ID_LOGITECH 0x046d
#define USB_DEVICE_ID_LOGITECH_RECEIVER 0xc101
#define USB_DEVICE_ID_LOGITECH_HARMONY_FIRST 0xc110
...
...
@@ -376,23 +383,23 @@
#define USB_VENDOR_ID_MONTEREY 0x0566
#define USB_DEVICE_ID_GENIUS_KB29E 0x3004
#define USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR 0x0400
#define USB_DEVICE_ID_N_S_HARMONY 0xc359
#define USB_VENDOR_ID_NATSU 0x08b7
#define USB_DEVICE_ID_NATSU_GAMEPAD 0x0001
#define USB_VENDOR_ID_NCR 0x0404
#define USB_DEVICE_ID_NCR_FIRST 0x0300
#define USB_DEVICE_ID_NCR_LAST 0x03ff
#define USB_VENDOR_ID_NATIONAL_SEMICONDUCTOR 0x0400
#define USB_DEVICE_ID_N_S_HARMONY 0xc359
#define USB_VENDOR_ID_NATSU 0x08b7
#define USB_DEVICE_ID_NATSU_GAMEPAD 0x0001
#define USB_VENDOR_ID_NEC 0x073e
#define USB_DEVICE_ID_NEC_USB_GAME_PAD 0x0301
#define USB_VENDOR_ID_NEXTWINDOW 0x1926
#define USB_DEVICE_ID_NEXTWINDOW_TOUCHSCREEN 0x0003
#define USB_VENDOR_ID_NTRIG
0x1b96
#define USB_VENDOR_ID_NTRIG
0x1b96
#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN 0x0001
#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_1 0x0003
#define USB_DEVICE_ID_NTRIG_TOUCH_SCREEN_2 0x0004
...
...
@@ -427,7 +434,7 @@
#define USB_VENDOR_ID_PETALYNX 0x18b1
#define USB_DEVICE_ID_PETALYNX_MAXTER_REMOTE 0x0037
#define USB_VENDOR_ID_PHILIPS
0x0471
#define USB_VENDOR_ID_PHILIPS
0x0471
#define USB_DEVICE_ID_PHILIPS_IEEE802154_DONGLE 0x0617
#define USB_VENDOR_ID_PLAYDOTCOM 0x0b43
...
...
@@ -439,16 +446,16 @@
#define USB_VENDOR_ID_PRODIGE 0x05af
#define USB_DEVICE_ID_PRODIGE_CORDLESS 0x3062
#define USB_VENDOR_ID_QUANTA 0x0408
#define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH 0x3000
#define USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN 0x3001
#define USB_VENDOR_ID_ROCCAT 0x1e7d
#define USB_DEVICE_ID_ROCCAT_KONE 0x2ced
#define USB_VENDOR_ID_SAITEK 0x06a3
#define USB_DEVICE_ID_SAITEK_RUMBLEPAD 0xff17
#define USB_VENDOR_ID_QUANTA 0x0408
#define USB_DEVICE_ID_QUANTA_OPTICAL_TOUCH 0x3000
#define USB_DEVICE_ID_PIXART_IMAGING_INC_OPTICAL_TOUCH_SCREEN 0x3001
#define USB_VENDOR_ID_SAMSUNG 0x0419
#define USB_DEVICE_ID_SAMSUNG_IR_REMOTE 0x0001
#define USB_DEVICE_ID_SAMSUNG_WIRELESS_KBD_MOUSE 0x0600
...
...
@@ -472,20 +479,20 @@
#define USB_VENDOR_ID_THRUSTMASTER 0x044f
#define USB_VENDOR_ID_TOUCHPACK 0x1bfd
#define USB_DEVICE_ID_TOUCHPACK_RTS 0x1688
#define USB_VENDOR_ID_TOPMAX 0x0663
#define USB_DEVICE_ID_TOPMAX_COBRAPAD 0x0103
#define USB_VENDOR_ID_TOPSEED 0x0766
#define USB_DEVICE_ID_TOPSEED_CYBERLINK 0x0204
#define USB_VENDOR_ID_TOUCHPACK 0x1bfd
#define USB_DEVICE_ID_TOUCHPACK_RTS 0x1688
#define USB_VENDOR_ID_TURBOX 0x062a
#define USB_DEVICE_ID_TURBOX_KEYBOARD 0x0201
#define USB_VENDOR_ID_TWINHAN
0x6253
#define USB_DEVICE_ID_TWINHAN_IR_REMOTE
0x0100
#define USB_VENDOR_ID_TWINHAN
0x6253
#define USB_DEVICE_ID_TWINHAN_IR_REMOTE
0x0100
#define USB_VENDOR_ID_UCLOGIC 0x5543
#define USB_DEVICE_ID_UCLOGIC_TABLET_PF1209 0x0042
...
...
@@ -522,9 +529,5 @@
#define USB_VENDOR_ID_ZYDACRON 0x13EC
#define USB_DEVICE_ID_ZYDACRON_REMOTE_CONTROL 0x0006
#define USB_VENDOR_ID_KYE 0x0458
#define USB_DEVICE_ID_KYE_ERGO_525V 0x0087
#define USB_DEVICE_ID_KYE_GPEN_560 0x5003
#endif
drivers/hid/hid-input.c
浏览文件 @
fc73697b
...
...
@@ -301,6 +301,9 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fiel
case
HID_UP_DIGITIZER
:
switch
(
usage
->
hid
&
0xff
)
{
case
0x00
:
/* Undefined */
goto
ignore
;
case
0x30
:
/* TipPressure */
if
(
!
test_bit
(
BTN_TOUCH
,
input
->
keybit
))
{
device
->
quirks
|=
HID_QUIRK_NOTOUCH
;
...
...
drivers/hid/hid-picolcd.c
浏览文件 @
fc73697b
...
...
@@ -127,6 +127,26 @@ static const struct fb_var_screeninfo picolcdfb_var = {
.
height
=
26
,
.
bits_per_pixel
=
1
,
.
grayscale
=
1
,
.
red
=
{
.
offset
=
0
,
.
length
=
1
,
.
msb_right
=
0
,
},
.
green
=
{
.
offset
=
0
,
.
length
=
1
,
.
msb_right
=
0
,
},
.
blue
=
{
.
offset
=
0
,
.
length
=
1
,
.
msb_right
=
0
,
},
.
transp
=
{
.
offset
=
0
,
.
length
=
0
,
.
msb_right
=
0
,
},
};
#endif
/* CONFIG_HID_PICOLCD_FB */
...
...
@@ -188,6 +208,7 @@ struct picolcd_data {
/* Framebuffer stuff */
u8
fb_update_rate
;
u8
fb_bpp
;
u8
fb_force
;
u8
*
fb_vbitmap
;
/* local copy of what was sent to PicoLCD */
u8
*
fb_bitmap
;
/* framebuffer */
struct
fb_info
*
fb_info
;
...
...
@@ -346,7 +367,7 @@ static int picolcd_fb_update_tile(u8 *vbitmap, const u8 *bitmap, int bpp,
const
u8
*
bdata
=
bitmap
+
tile
*
256
+
chip
*
8
+
b
*
32
;
for
(
i
=
0
;
i
<
64
;
i
++
)
{
tdata
[
i
]
<<=
1
;
tdata
[
i
]
|=
(
bdata
[
i
/
8
]
>>
(
7
-
i
%
8
))
&
0x01
;
tdata
[
i
]
|=
(
bdata
[
i
/
8
]
>>
(
i
%
8
))
&
0x01
;
}
}
}
else
if
(
bpp
==
8
)
{
...
...
@@ -399,13 +420,10 @@ static int picolcd_fb_reset(struct picolcd_data *data, int clear)
if
(
data
->
fb_bitmap
)
{
if
(
clear
)
{
memset
(
data
->
fb_vbitmap
,
0
xff
,
PICOLCDFB_SIZE
);
memset
(
data
->
fb_vbitmap
,
0
,
PICOLCDFB_SIZE
);
memset
(
data
->
fb_bitmap
,
0
,
PICOLCDFB_SIZE
*
data
->
fb_bpp
);
}
else
{
/* invert 1 byte in each tile to force resend */
for
(
i
=
0
;
i
<
PICOLCDFB_SIZE
;
i
+=
64
)
data
->
fb_vbitmap
[
i
]
=
~
data
->
fb_vbitmap
[
i
];
}
data
->
fb_force
=
1
;
}
/* schedule first output of framebuffer */
...
...
@@ -421,6 +439,9 @@ static void picolcd_fb_update(struct picolcd_data *data)
int
chip
,
tile
,
n
;
unsigned
long
flags
;
if
(
!
data
)
return
;
spin_lock_irqsave
(
&
data
->
lock
,
flags
);
if
(
!
(
data
->
status
&
PICOLCD_READY_FB
))
{
spin_unlock_irqrestore
(
&
data
->
lock
,
flags
);
...
...
@@ -440,14 +461,18 @@ static void picolcd_fb_update(struct picolcd_data *data)
for
(
chip
=
0
;
chip
<
4
;
chip
++
)
for
(
tile
=
0
;
tile
<
8
;
tile
++
)
if
(
picolcd_fb_update_tile
(
data
->
fb_vbitmap
,
data
->
fb_bitmap
,
data
->
fb_bpp
,
chip
,
tile
))
{
data
->
fb_bitmap
,
data
->
fb_bpp
,
chip
,
tile
)
||
data
->
fb_force
)
{
n
+=
2
;
if
(
!
data
->
fb_info
->
par
)
return
;
/* device lost! */
if
(
n
>=
HID_OUTPUT_FIFO_SIZE
/
2
)
{
usbhid_wait_io
(
data
->
hdev
);
n
=
0
;
}
picolcd_fb_send_tile
(
data
->
hdev
,
chip
,
tile
);
}
data
->
fb_force
=
false
;
if
(
n
)
usbhid_wait_io
(
data
->
hdev
);
}
...
...
@@ -511,11 +536,23 @@ static int picolcd_fb_blank(int blank, struct fb_info *info)
static
void
picolcd_fb_destroy
(
struct
fb_info
*
info
)
{
struct
picolcd_data
*
data
=
info
->
par
;
u32
*
ref_cnt
=
info
->
pseudo_palette
;
int
may_release
;
info
->
par
=
NULL
;
if
(
data
)
data
->
fb_info
=
NULL
;
fb_deferred_io_cleanup
(
info
);
framebuffer_release
(
info
);
ref_cnt
--
;
mutex_lock
(
&
info
->
lock
);
(
*
ref_cnt
)
--
;
may_release
=
!
ref_cnt
;
mutex_unlock
(
&
info
->
lock
);
if
(
may_release
)
{
framebuffer_release
(
info
);
vfree
((
u8
*
)
info
->
fix
.
smem_start
);
}
}
static
int
picolcd_fb_check_var
(
struct
fb_var_screeninfo
*
var
,
struct
fb_info
*
info
)
...
...
@@ -526,29 +563,37 @@ static int picolcd_fb_check_var(struct fb_var_screeninfo *var, struct fb_info *i
/* only allow 1/8 bit depth (8-bit is grayscale) */
*
var
=
picolcdfb_var
;
var
->
activate
=
activate
;
if
(
bpp
>=
8
)
if
(
bpp
>=
8
)
{
var
->
bits_per_pixel
=
8
;
else
var
->
red
.
length
=
8
;
var
->
green
.
length
=
8
;
var
->
blue
.
length
=
8
;
}
else
{
var
->
bits_per_pixel
=
1
;
var
->
red
.
length
=
1
;
var
->
green
.
length
=
1
;
var
->
blue
.
length
=
1
;
}
return
0
;
}
static
int
picolcd_set_par
(
struct
fb_info
*
info
)
{
struct
picolcd_data
*
data
=
info
->
par
;
u8
*
o_fb
,
*
n_fb
;
u8
*
tmp_fb
,
*
o_fb
;
if
(
!
data
)
return
-
ENODEV
;
if
(
info
->
var
.
bits_per_pixel
==
data
->
fb_bpp
)
return
0
;
/* switch between 1/8 bit depths */
if
(
info
->
var
.
bits_per_pixel
!=
1
&&
info
->
var
.
bits_per_pixel
!=
8
)
return
-
EINVAL
;
o_fb
=
data
->
fb_bitmap
;
n_fb
=
vmalloc
(
PICOLCDFB_SIZE
*
info
->
var
.
bits_per_pixel
);
if
(
!
n
_fb
)
o_fb
=
data
->
fb_bitmap
;
tmp_fb
=
kmalloc
(
PICOLCDFB_SIZE
*
info
->
var
.
bits_per_pixel
,
GFP_KERNEL
);
if
(
!
tmp
_fb
)
return
-
ENOMEM
;
fb_deferred_io_cleanup
(
info
);
/* translate FB content to new bits-per-pixel */
if
(
info
->
var
.
bits_per_pixel
==
1
)
{
int
i
,
b
;
...
...
@@ -558,24 +603,87 @@ static int picolcd_set_par(struct fb_info *info)
p
<<=
1
;
p
|=
o_fb
[
i
*
8
+
b
]
?
0x01
:
0x00
;
}
tmp_fb
[
i
]
=
p
;
}
memcpy
(
o_fb
,
tmp_fb
,
PICOLCDFB_SIZE
);
info
->
fix
.
visual
=
FB_VISUAL_MONO01
;
info
->
fix
.
line_length
=
PICOLCDFB_WIDTH
/
8
;
}
else
{
int
i
;
memcpy
(
tmp_fb
,
o_fb
,
PICOLCDFB_SIZE
);
for
(
i
=
0
;
i
<
PICOLCDFB_SIZE
*
8
;
i
++
)
n_fb
[
i
]
=
o
_fb
[
i
/
8
]
&
(
0x01
<<
(
7
-
i
%
8
))
?
0xff
:
0x00
;
info
->
fix
.
visual
=
FB_VISUAL_
TRUE
COLOR
;
o_fb
[
i
]
=
tmp
_fb
[
i
/
8
]
&
(
0x01
<<
(
7
-
i
%
8
))
?
0xff
:
0x00
;
info
->
fix
.
visual
=
FB_VISUAL_
DIRECT
COLOR
;
info
->
fix
.
line_length
=
PICOLCDFB_WIDTH
;
}
data
->
fb_bitmap
=
n_fb
;
kfree
(
tmp_fb
)
;
data
->
fb_bpp
=
info
->
var
.
bits_per_pixel
;
info
->
screen_base
=
(
char
__force
__iomem
*
)
n_fb
;
info
->
fix
.
smem_start
=
(
unsigned
long
)
n_fb
;
info
->
fix
.
smem_len
=
PICOLCDFB_SIZE
*
data
->
fb_bpp
;
fb_deferred_io_init
(
info
);
vfree
(
o_fb
);
return
0
;
}
/* Do refcounting on our FB and cleanup per worker if FB is
* closed after unplug of our device
* (fb_release holds info->lock and still touches info after
* we return so we can't release it immediately.
*/
struct
picolcd_fb_cleanup_item
{
struct
fb_info
*
info
;
struct
picolcd_fb_cleanup_item
*
next
;
};
static
struct
picolcd_fb_cleanup_item
*
fb_pending
;
DEFINE_SPINLOCK
(
fb_pending_lock
);
static
void
picolcd_fb_do_cleanup
(
struct
work_struct
*
data
)
{
struct
picolcd_fb_cleanup_item
*
item
;
unsigned
long
flags
;
do
{
spin_lock_irqsave
(
&
fb_pending_lock
,
flags
);
item
=
fb_pending
;
fb_pending
=
item
?
item
->
next
:
NULL
;
spin_unlock_irqrestore
(
&
fb_pending_lock
,
flags
);
if
(
item
)
{
u8
*
fb
=
(
u8
*
)
item
->
info
->
fix
.
smem_start
;
/* make sure we do not race against fb core when
* releasing */
mutex_lock
(
&
item
->
info
->
lock
);
mutex_unlock
(
&
item
->
info
->
lock
);
framebuffer_release
(
item
->
info
);
vfree
(
fb
);
}
}
while
(
item
);
}
DECLARE_WORK
(
picolcd_fb_cleanup
,
picolcd_fb_do_cleanup
);
static
int
picolcd_fb_open
(
struct
fb_info
*
info
,
int
u
)
{
u32
*
ref_cnt
=
info
->
pseudo_palette
;
ref_cnt
--
;
(
*
ref_cnt
)
++
;
return
0
;
}
static
int
picolcd_fb_release
(
struct
fb_info
*
info
,
int
u
)
{
u32
*
ref_cnt
=
info
->
pseudo_palette
;
ref_cnt
--
;
(
*
ref_cnt
)
++
;
if
(
!*
ref_cnt
)
{
unsigned
long
flags
;
struct
picolcd_fb_cleanup_item
*
item
=
(
struct
picolcd_fb_cleanup_item
*
)
ref_cnt
;
item
--
;
spin_lock_irqsave
(
&
fb_pending_lock
,
flags
);
item
->
next
=
fb_pending
;
fb_pending
=
item
;
spin_unlock_irqrestore
(
&
fb_pending_lock
,
flags
);
schedule_work
(
&
picolcd_fb_cleanup
);
}
return
0
;
}
...
...
@@ -583,6 +691,8 @@ static int picolcd_set_par(struct fb_info *info)
static
struct
fb_ops
picolcdfb_ops
=
{
.
owner
=
THIS_MODULE
,
.
fb_destroy
=
picolcd_fb_destroy
,
.
fb_open
=
picolcd_fb_open
,
.
fb_release
=
picolcd_fb_release
,
.
fb_read
=
fb_sys_read
,
.
fb_write
=
picolcd_fb_write
,
.
fb_blank
=
picolcd_fb_blank
,
...
...
@@ -660,11 +770,12 @@ static int picolcd_init_framebuffer(struct picolcd_data *data)
{
struct
device
*
dev
=
&
data
->
hdev
->
dev
;
struct
fb_info
*
info
=
NULL
;
int
error
=
-
ENOMEM
;
int
i
,
error
=
-
ENOMEM
;
u8
*
fb_vbitmap
=
NULL
;
u8
*
fb_bitmap
=
NULL
;
u32
*
palette
;
fb_bitmap
=
vmalloc
(
PICOLCDFB_SIZE
*
picolcdfb_var
.
bits_per_pixel
);
fb_bitmap
=
vmalloc
(
PICOLCDFB_SIZE
*
8
);
if
(
fb_bitmap
==
NULL
)
{
dev_err
(
dev
,
"can't get a free page for framebuffer
\n
"
);
goto
err_nomem
;
...
...
@@ -678,18 +789,29 @@ static int picolcd_init_framebuffer(struct picolcd_data *data)
data
->
fb_update_rate
=
PICOLCDFB_UPDATE_RATE_DEFAULT
;
data
->
fb_defio
=
picolcd_fb_defio
;
info
=
framebuffer_alloc
(
0
,
dev
);
/* The extra memory is:
* - struct picolcd_fb_cleanup_item
* - u32 for ref_count
* - 256*u32 for pseudo_palette
*/
info
=
framebuffer_alloc
(
257
*
sizeof
(
u32
)
+
sizeof
(
struct
picolcd_fb_cleanup_item
),
dev
);
if
(
info
==
NULL
)
{
dev_err
(
dev
,
"failed to allocate a framebuffer
\n
"
);
goto
err_nomem
;
}
palette
=
info
->
par
+
sizeof
(
struct
picolcd_fb_cleanup_item
);
*
palette
=
1
;
palette
++
;
for
(
i
=
0
;
i
<
256
;
i
++
)
palette
[
i
]
=
i
>
0
&&
i
<
16
?
0xff
:
0
;
info
->
pseudo_palette
=
palette
;
info
->
fbdefio
=
&
data
->
fb_defio
;
info
->
screen_base
=
(
char
__force
__iomem
*
)
fb_bitmap
;
info
->
fbops
=
&
picolcdfb_ops
;
info
->
var
=
picolcdfb_var
;
info
->
fix
=
picolcdfb_fix
;
info
->
fix
.
smem_len
=
PICOLCDFB_SIZE
;
info
->
fix
.
smem_len
=
PICOLCDFB_SIZE
*
8
;
info
->
fix
.
smem_start
=
(
unsigned
long
)
fb_bitmap
;
info
->
par
=
data
;
info
->
flags
=
FBINFO_FLAG_DEFAULT
;
...
...
@@ -707,18 +829,20 @@ static int picolcd_init_framebuffer(struct picolcd_data *data)
dev_err
(
dev
,
"failed to create sysfs attributes
\n
"
);
goto
err_cleanup
;
}
fb_deferred_io_init
(
info
);
data
->
fb_info
=
info
;
error
=
register_framebuffer
(
info
);
if
(
error
)
{
dev_err
(
dev
,
"failed to register framebuffer
\n
"
);
goto
err_sysfs
;
}
fb_deferred_io_init
(
info
);
/* schedule first output of framebuffer */
data
->
fb_force
=
1
;
schedule_delayed_work
(
&
info
->
deferred_work
,
0
);
return
0
;
err_sysfs:
fb_deferred_io_cleanup
(
info
);
device_remove_file
(
dev
,
&
dev_attr_fb_update_rate
);
err_cleanup:
data
->
fb_vbitmap
=
NULL
;
...
...
@@ -737,19 +861,17 @@ static void picolcd_exit_framebuffer(struct picolcd_data *data)
{
struct
fb_info
*
info
=
data
->
fb_info
;
u8
*
fb_vbitmap
=
data
->
fb_vbitmap
;
u8
*
fb_bitmap
=
data
->
fb_bitmap
;
if
(
!
info
)
return
;
info
->
par
=
NULL
;
device_remove_file
(
&
data
->
hdev
->
dev
,
&
dev_attr_fb_update_rate
);
unregister_framebuffer
(
info
);
data
->
fb_vbitmap
=
NULL
;
data
->
fb_bitmap
=
NULL
;
data
->
fb_bpp
=
0
;
data
->
fb_info
=
NULL
;
device_remove_file
(
&
data
->
hdev
->
dev
,
&
dev_attr_fb_update_rate
);
fb_deferred_io_cleanup
(
info
);
unregister_framebuffer
(
info
);
vfree
(
fb_bitmap
);
kfree
(
fb_vbitmap
);
}
...
...
@@ -2566,6 +2688,13 @@ static void picolcd_remove(struct hid_device *hdev)
spin_lock_irqsave
(
&
data
->
lock
,
flags
);
data
->
status
|=
PICOLCD_FAILED
;
spin_unlock_irqrestore
(
&
data
->
lock
,
flags
);
#ifdef CONFIG_HID_PICOLCD_FB
/* short-circuit FB as early as possible in order to
* avoid long delays if we host console.
*/
if
(
data
->
fb_info
)
data
->
fb_info
->
par
=
NULL
;
#endif
picolcd_exit_devfs
(
data
);
device_remove_file
(
&
hdev
->
dev
,
&
dev_attr_operation_mode
);
...
...
@@ -2623,6 +2752,10 @@ static int __init picolcd_init(void)
static
void
__exit
picolcd_exit
(
void
)
{
hid_unregister_driver
(
&
picolcd_driver
);
#ifdef CONFIG_HID_PICOLCD_FB
flush_scheduled_work
();
WARN_ON
(
fb_pending
);
#endif
}
module_init
(
picolcd_init
);
...
...
drivers/hid/hidraw.c
浏览文件 @
fc73697b
...
...
@@ -46,7 +46,6 @@ static ssize_t hidraw_read(struct file *file, char __user *buffer, size_t count,
{
struct
hidraw_list
*
list
=
file
->
private_data
;
int
ret
=
0
,
len
;
char
*
report
;
DECLARE_WAITQUEUE
(
wait
,
current
);
mutex_lock
(
&
list
->
read_mutex
);
...
...
@@ -84,7 +83,6 @@ static ssize_t hidraw_read(struct file *file, char __user *buffer, size_t count,
if
(
ret
)
goto
out
;
report
=
list
->
buffer
[
list
->
tail
].
value
;
len
=
list
->
buffer
[
list
->
tail
].
len
>
count
?
count
:
list
->
buffer
[
list
->
tail
].
len
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录