Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
gsplhtlxg
clone-Linux
提交
969b21cd
C
clone-Linux
项目概览
gsplhtlxg
/
clone-Linux
通知
2
Star
0
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
C
clone-Linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
969b21cd
编写于
4月 02, 2006
作者:
D
Dmitry Torokhov
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Input: convert /proc handling to seq_file
Signed-off-by:
N
Dmitry Torokhov
<
dtor@mail.ru
>
上级
2db66876
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
168 addition
and
111 deletion
+168
-111
drivers/input/input.c
drivers/input/input.c
+168
-111
未找到文件。
drivers/input/input.c
浏览文件 @
969b21cd
...
...
@@ -18,6 +18,7 @@
#include <linux/random.h>
#include <linux/major.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/interrupt.h>
#include <linux/poll.h>
#include <linux/device.h>
...
...
@@ -316,26 +317,6 @@ static struct input_device_id *input_match_device(struct input_device_id *id, st
return
NULL
;
}
static
int
input_print_bitmap
(
char
*
buf
,
int
buf_size
,
unsigned
long
*
bitmap
,
int
max
,
int
add_cr
)
{
int
i
;
int
len
=
0
;
for
(
i
=
NBITS
(
max
)
-
1
;
i
>
0
;
i
--
)
if
(
bitmap
[
i
])
break
;
for
(;
i
>=
0
;
i
--
)
len
+=
snprintf
(
buf
+
len
,
max
(
buf_size
-
len
,
0
),
"%lx%s"
,
bitmap
[
i
],
i
>
0
?
" "
:
""
);
if
(
add_cr
)
len
+=
snprintf
(
buf
+
len
,
max
(
buf_size
-
len
,
0
),
"
\n
"
);
return
len
;
}
#ifdef CONFIG_PROC_FS
static
struct
proc_dir_entry
*
proc_bus_input_dir
;
...
...
@@ -348,7 +329,7 @@ static inline void input_wakeup_procfs_readers(void)
wake_up
(
&
input_devices_poll_wait
);
}
static
unsigned
int
input_devices_poll
(
struct
file
*
file
,
poll_table
*
wait
)
static
unsigned
int
input_
proc_
devices_poll
(
struct
file
*
file
,
poll_table
*
wait
)
{
int
state
=
input_devices_state
;
poll_wait
(
file
,
&
input_devices_poll_wait
,
wait
);
...
...
@@ -357,114 +338,171 @@ static unsigned int input_devices_poll(struct file *file, poll_table *wait)
return
0
;
}
#define SPRINTF_BIT(ev, bm) \
do { \
len += sprintf(buf + len, "B: %s=", #ev); \
len += input_print_bitmap(buf + len, INT_MAX, \
dev->bm##bit, ev##_MAX, 1); \
} while (0)
static
struct
list_head
*
list_get_nth_element
(
struct
list_head
*
list
,
loff_t
*
pos
)
{
struct
list_head
*
node
;
loff_t
i
=
0
;
#define TEST_AND_SPRINTF_BIT(ev, bm) \
do { \
if (test_bit(EV_##ev, dev->evbit)) \
SPRINTF_BIT(ev, bm); \
} while (0)
list_for_each
(
node
,
list
)
if
(
i
++
==
*
pos
)
return
node
;
return
NULL
;
}
static
int
input_devices_read
(
char
*
buf
,
char
**
start
,
off_t
pos
,
int
count
,
int
*
eof
,
void
*
data
)
static
struct
list_head
*
list_get_next_element
(
struct
list_head
*
list
,
struct
list_head
*
element
,
loff_t
*
pos
)
{
struct
input_dev
*
dev
;
struct
input_handle
*
handle
;
const
char
*
path
;
if
(
element
->
next
==
list
)
return
NULL
;
off_t
at
=
0
;
int
len
,
cnt
=
0
;
++
(
*
pos
);
return
element
->
next
;
}
list_for_each_entry
(
dev
,
&
input_dev_list
,
node
)
{
static
void
*
input_devices_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
/* acquire lock here ... Yes, we do need locking, I knowi, I know... */
path
=
kobject_get_path
(
&
dev
->
cdev
.
kobj
,
GFP_KERNEL
);
return
list_get_nth_element
(
&
input_dev_list
,
pos
);
}
len
=
sprintf
(
buf
,
"I: Bus=%04x Vendor=%04x Product=%04x Version=%04x
\n
"
,
dev
->
id
.
bustype
,
dev
->
id
.
vendor
,
dev
->
id
.
product
,
dev
->
id
.
version
);
static
void
*
input_devices_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
{
return
list_get_next_element
(
&
input_dev_list
,
v
,
pos
);
}
len
+=
sprintf
(
buf
+
len
,
"N: Name=
\"
%s
\"\n
"
,
dev
->
name
?
dev
->
name
:
""
);
len
+=
sprintf
(
buf
+
len
,
"P: Phys=%s
\n
"
,
dev
->
phys
?
dev
->
phys
:
""
);
len
+=
sprintf
(
buf
+
len
,
"S: Sysfs=%s
\n
"
,
path
?
path
:
""
);
len
+=
sprintf
(
buf
+
len
,
"H: Handlers="
);
static
void
input_devices_seq_stop
(
struct
seq_file
*
seq
,
void
*
v
)
{
/* release lock here */
}
list_for_each_entry
(
handle
,
&
dev
->
h_list
,
d_node
)
len
+=
sprintf
(
buf
+
len
,
"%s "
,
handle
->
name
);
len
+=
sprintf
(
buf
+
len
,
"
\n
"
);
SPRINTF_BIT
(
EV
,
ev
);
TEST_AND_SPRINTF_BIT
(
KEY
,
key
);
TEST_AND_SPRINTF_BIT
(
REL
,
rel
);
TEST_AND_SPRINTF_BIT
(
ABS
,
abs
);
TEST_AND_SPRINTF_BIT
(
MSC
,
msc
);
TEST_AND_SPRINTF_BIT
(
LED
,
led
);
TEST_AND_SPRINTF_BIT
(
SND
,
snd
);
TEST_AND_SPRINTF_BIT
(
FF
,
ff
);
TEST_AND_SPRINTF_BIT
(
SW
,
sw
);
len
+=
sprintf
(
buf
+
len
,
"
\n
"
);
at
+=
len
;
if
(
at
>=
pos
)
{
if
(
!*
start
)
{
*
start
=
buf
+
(
pos
-
(
at
-
len
));
cnt
=
at
-
pos
;
}
else
cnt
+=
len
;
buf
+=
len
;
if
(
cnt
>=
count
)
break
;
}
static
void
input_seq_print_bitmap
(
struct
seq_file
*
seq
,
const
char
*
name
,
unsigned
long
*
bitmap
,
int
max
)
{
int
i
;
kfree
(
path
);
}
for
(
i
=
NBITS
(
max
)
-
1
;
i
>
0
;
i
--
)
if
(
bitmap
[
i
])
break
;
seq_printf
(
seq
,
"B: %s="
,
name
);
for
(;
i
>=
0
;
i
--
)
seq_printf
(
seq
,
"%lx%s"
,
bitmap
[
i
],
i
>
0
?
" "
:
""
);
seq_putc
(
seq
,
'\n'
);
}
static
int
input_devices_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
struct
input_dev
*
dev
=
container_of
(
v
,
struct
input_dev
,
node
);
const
char
*
path
=
kobject_get_path
(
&
dev
->
cdev
.
kobj
,
GFP_KERNEL
);
struct
input_handle
*
handle
;
seq_printf
(
seq
,
"I: Bus=%04x Vendor=%04x Product=%04x Version=%04x
\n
"
,
dev
->
id
.
bustype
,
dev
->
id
.
vendor
,
dev
->
id
.
product
,
dev
->
id
.
version
);
seq_printf
(
seq
,
"N: Name=
\"
%s
\"\n
"
,
dev
->
name
?
dev
->
name
:
""
);
seq_printf
(
seq
,
"P: Phys=%s
\n
"
,
dev
->
phys
?
dev
->
phys
:
""
);
seq_printf
(
seq
,
"S: Sysfs=%s
\n
"
,
path
?
path
:
""
);
seq_printf
(
seq
,
"H: Handlers="
);
if
(
&
dev
->
node
==
&
input_dev_list
)
*
eof
=
1
;
list_for_each_entry
(
handle
,
&
dev
->
h_list
,
d_node
)
seq_printf
(
seq
,
"%s "
,
handle
->
name
);
seq_putc
(
seq
,
'\n'
);
return
(
count
>
cnt
)
?
cnt
:
count
;
input_seq_print_bitmap
(
seq
,
"EV"
,
dev
->
evbit
,
EV_MAX
);
if
(
test_bit
(
EV_KEY
,
dev
->
evbit
))
input_seq_print_bitmap
(
seq
,
"KEY"
,
dev
->
keybit
,
KEY_MAX
);
if
(
test_bit
(
EV_REL
,
dev
->
evbit
))
input_seq_print_bitmap
(
seq
,
"REL"
,
dev
->
relbit
,
REL_MAX
);
if
(
test_bit
(
EV_ABS
,
dev
->
evbit
))
input_seq_print_bitmap
(
seq
,
"ABS"
,
dev
->
absbit
,
ABS_MAX
);
if
(
test_bit
(
EV_MSC
,
dev
->
evbit
))
input_seq_print_bitmap
(
seq
,
"MSC"
,
dev
->
mscbit
,
MSC_MAX
);
if
(
test_bit
(
EV_LED
,
dev
->
evbit
))
input_seq_print_bitmap
(
seq
,
"LED"
,
dev
->
ledbit
,
LED_MAX
);
if
(
test_bit
(
EV_SND
,
dev
->
evbit
))
input_seq_print_bitmap
(
seq
,
"SND"
,
dev
->
sndbit
,
SND_MAX
);
if
(
test_bit
(
EV_FF
,
dev
->
evbit
))
input_seq_print_bitmap
(
seq
,
"FF"
,
dev
->
ffbit
,
FF_MAX
);
if
(
test_bit
(
EV_SW
,
dev
->
evbit
))
input_seq_print_bitmap
(
seq
,
"SW"
,
dev
->
swbit
,
SW_MAX
);
seq_putc
(
seq
,
'\n'
);
kfree
(
path
);
return
0
;
}
static
int
input_handlers_read
(
char
*
buf
,
char
**
start
,
off_t
pos
,
int
count
,
int
*
eof
,
void
*
data
)
static
struct
seq_operations
input_devices_seq_ops
=
{
.
start
=
input_devices_seq_start
,
.
next
=
input_devices_seq_next
,
.
stop
=
input_devices_seq_stop
,
.
show
=
input_devices_seq_show
,
};
static
int
input_proc_devices_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
struct
input_handler
*
handler
;
return
seq_open
(
file
,
&
input_devices_seq_ops
);
}
off_t
at
=
0
;
int
len
=
0
,
cnt
=
0
;
int
i
=
0
;
static
struct
file_operations
input_devices_fileops
=
{
.
owner
=
THIS_MODULE
,
.
open
=
input_proc_devices_open
,
.
poll
=
input_proc_devices_poll
,
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
seq_release
,
};
list_for_each_entry
(
handler
,
&
input_handler_list
,
node
)
{
static
void
*
input_handlers_seq_start
(
struct
seq_file
*
seq
,
loff_t
*
pos
)
{
/* acquire lock here ... Yes, we do need locking, I knowi, I know... */
seq
->
private
=
(
void
*
)(
unsigned
long
)
*
pos
;
return
list_get_nth_element
(
&
input_handler_list
,
pos
);
}
if
(
handler
->
fops
)
len
=
sprintf
(
buf
,
"N: Number=%d Name=%s Minor=%d
\n
"
,
i
++
,
handler
->
name
,
handler
->
minor
);
else
len
=
sprintf
(
buf
,
"N: Number=%d Name=%s
\n
"
,
i
++
,
handler
->
name
);
static
void
*
input_handlers_seq_next
(
struct
seq_file
*
seq
,
void
*
v
,
loff_t
*
pos
)
{
seq
->
private
=
(
void
*
)(
unsigned
long
)(
*
pos
+
1
);
return
list_get_next_element
(
&
input_handler_list
,
v
,
pos
);
}
at
+=
len
;
static
void
input_handlers_seq_stop
(
struct
seq_file
*
seq
,
void
*
v
)
{
/* release lock here */
}
if
(
at
>=
pos
)
{
if
(
!*
start
)
{
*
start
=
buf
+
(
pos
-
(
at
-
len
));
cnt
=
at
-
pos
;
}
else
cnt
+=
len
;
buf
+=
len
;
if
(
cnt
>=
count
)
break
;
}
}
if
(
&
handler
->
node
==
&
input_handler_list
)
*
eof
=
1
;
static
int
input_handlers_seq_show
(
struct
seq_file
*
seq
,
void
*
v
)
{
struct
input_handler
*
handler
=
container_of
(
v
,
struct
input_handler
,
node
);
return
(
count
>
cnt
)
?
cnt
:
count
;
seq_printf
(
seq
,
"N: Number=%ld Name=%s"
,
(
unsigned
long
)
seq
->
private
,
handler
->
name
);
if
(
handler
->
fops
)
seq_printf
(
seq
,
" Minor=%d"
,
handler
->
minor
);
seq_putc
(
seq
,
'\n'
);
return
0
;
}
static
struct
seq_operations
input_handlers_seq_ops
=
{
.
start
=
input_handlers_seq_start
,
.
next
=
input_handlers_seq_next
,
.
stop
=
input_handlers_seq_stop
,
.
show
=
input_handlers_seq_show
,
};
static
struct
file_operations
input_fileops
;
static
int
input_proc_handlers_open
(
struct
inode
*
inode
,
struct
file
*
file
)
{
return
seq_open
(
file
,
&
input_handlers_seq_ops
);
}
static
struct
file_operations
input_handlers_fileops
=
{
.
owner
=
THIS_MODULE
,
.
open
=
input_proc_handlers_open
,
.
read
=
seq_read
,
.
llseek
=
seq_lseek
,
.
release
=
seq_release
,
};
static
int
__init
input_proc_init
(
void
)
{
...
...
@@ -476,20 +514,19 @@ static int __init input_proc_init(void)
proc_bus_input_dir
->
owner
=
THIS_MODULE
;
entry
=
create_proc_
read_entry
(
"devices"
,
0
,
proc_bus_input_dir
,
input_devices_read
,
NULL
);
entry
=
create_proc_
entry
(
"devices"
,
0
,
proc_bus_input_dir
);
if
(
!
entry
)
goto
fail1
;
entry
->
owner
=
THIS_MODULE
;
input_fileops
=
*
entry
->
proc_fops
;
input_fileops
.
poll
=
input_devices_poll
;
entry
->
proc_fops
=
&
input_fileops
;
entry
->
proc_fops
=
&
input_devices_fileops
;
entry
=
create_proc_
read_entry
(
"handlers"
,
0
,
proc_bus_input_dir
,
input_handlers_read
,
NULL
);
entry
=
create_proc_
entry
(
"handlers"
,
0
,
proc_bus_input_dir
);
if
(
!
entry
)
goto
fail2
;
entry
->
owner
=
THIS_MODULE
;
entry
->
proc_fops
=
&
input_handlers_fileops
;
return
0
;
...
...
@@ -631,6 +668,26 @@ static struct attribute_group input_dev_id_attr_group = {
.
attrs
=
input_dev_id_attrs
,
};
static
int
input_print_bitmap
(
char
*
buf
,
int
buf_size
,
unsigned
long
*
bitmap
,
int
max
,
int
add_cr
)
{
int
i
;
int
len
=
0
;
for
(
i
=
NBITS
(
max
)
-
1
;
i
>
0
;
i
--
)
if
(
bitmap
[
i
])
break
;
for
(;
i
>=
0
;
i
--
)
len
+=
snprintf
(
buf
+
len
,
max
(
buf_size
-
len
,
0
),
"%lx%s"
,
bitmap
[
i
],
i
>
0
?
" "
:
""
);
if
(
add_cr
)
len
+=
snprintf
(
buf
+
len
,
max
(
buf_size
-
len
,
0
),
"
\n
"
);
return
len
;
}
#define INPUT_DEV_CAP_ATTR(ev, bm) \
static ssize_t input_dev_show_cap_##bm(struct class_device *dev, char *buf) \
{ \
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录