SylixOS字符设备驱动开发(五)
SylixOS驱动使用和信息查询
在上一节我们学习了如何注册驱动和创建设备文件,现在我们来学习驱动注册后如何在应用层使用驱动和如何查询驱动在系统中的相关信息。
应用层使用设备文件很简单,就是先使用open接口以读写方式打开,然后打印一句话再关闭:
#include <stdio.h>
int main (int argc, char **argv)
{
int fd;
fd = open("/dev/demo", O_RDWR);
if (fd < 0) {
printf("open file fail.\r\n");
return -1;
}
printf("Hello demo.\r\n");
close(fd);
return (0);
}
通过IDE中的SylixOS App工程来创建一个应用程序。
首先通过insmod命令加载驱动,然后运行app,终端输出打印信息:
[root@sylixos:/root]# insmod /lib/modules/driver_demo4.ko
module /lib/modules/driver_demo4.ko register ok, handle: 0x365c7e0
[root@sylixos:/root]#
[root@sylixos:/root]# cd /apps/app_demo4
[root@sylixos:/apps/app_demo4]# ./app_demo4
demo_open .
open read/write.
file permission: 644.
Hello demo.
demo_close.
[root@sylixos:/apps/app_demo4]#
可以看出,运行程序后,输出的前3条信息都是驱动的open函数打印的,第4条信息是应用程序自身打印的,最后一条信息是驱动的close函数打印的。
上面这种方式是通过一个应用进程的方式打开和关闭一个设备文件,我们还可以直接在命令行使用open 打开一个设备文件:
[root@sylixos:/root]# open /dev/demo
demo_open .
open read only.
file permission: 644.
_IosFileIoctl() error: unknown request.
in thread "t_tshell" context.
open file return: 8 dev 250000 inode 0 size 0
[root@sylixos:/root]#
通过这种方式打开的文件是属于内核的,而不是属于某个进程的。通过上面的打印信息我们还知道内核是以只读的方式打开文件的,
另外还报了一个ioctl相关的错误,因为我们驱动中还未实现ioctl函数,最后的open file return: 后面的8表示文件描述符id为8。我们可以通过files 命令来查看内核一共打开了哪些文件:
[root@sylixos:/root]# files
kernel filedes show (process filedes in /proc/${pid}/filedes) >>
fd abn name type drv
3 /dev/ttyS0 orig 18 GLB STD_IN GLB STD_OUT GLB STD_ERR
4 /dev/socket socket 32
5 /dev/socket socket 32
6 /dev/hotplug orig 12
7 /dev/input/touch0 new_1 29
8 /dev/demo orig 37
[root@sylixos:/root]#
通过close 命令关闭内核打开的文件,如下所示:
[root@sylixos:/root]# close 8
demo_close.
[root@sylixos:/root]#
通过devs 查看当前系统所有设备文件信息,如下所示:
[root@sylixos:/root]# devs
device show (minor device) >>
drv dev open name
37 0 0 /dev/demo
36 1 0 /dev/input/xmse
36 0 0 /dev/input/xkbd
35 0 0 /dev/netbd
34 0 0 /dev/netbr
33 0 0 /dev/net/vnd
32 0 0 /dev/socket
31 0 0 /dev/netevent
24 0 0 /ram
29 0 1 /dev/input/touch0
30 0 0 /dev/fb0
23 0 0 /media/sdcard0
10 0 0 /dev/blk/sdcard-0
27 0 0 /yaffs2
18 0 1 /dev/ttyS0
15 1 0 /dev/urandom
15 0 0 /dev/random
14 0 0 /dev/shm
13 0 0 /proc
12 0 1 /dev/hotplug
11 0 0 /dev/epollfd
9 0 0 /dev/gpiofd
8 0 0 /dev/signalfd
7 0 0 /dev/hstimerfd
6 0 0 /dev/timerfd
5 0 0 /dev/semfd
4 0 0 /dev/bmsg
3 0 0 /dev/eventfd
1 0 0 /dev/zero
0 0 0 /dev/null
2 0 0 /
[root@sylixos:/root]#
drv表示驱动索引号,dev表示这是驱动对应的第几个设备实例,比如上面的36号驱动有两个设备文件,
/dev/input/xkbd 和 /dev/input/xmse 分别对应36号驱动的第0个和第1个设备。open表示当前设备被打开几次。
一个设备文件被打开的次数是在驱动在open和close时通过增减设备实例变量中的引用计数来实现的,这是留给驱动开发者来做的,而不是系统来做的。
通过drvlics 命令来查看所有驱动遵循的开源协议和开发者信息:
[root@sylixos:/root]# drvlics
driver License show (major device) >>
DRV DESCRIPTION AUTHOR LICENSE
--- ------------------------------ -------------------- ------------------------
0 null device driver. Han.hui GPL->Ver 2.0
1 zero device driver. Han.hui GPL->Ver 2.0
2 rootfs driver. Han.hui GPL->Ver 2.0
3 eventfd driver. Han.hui GPL->Ver 2.0
4 block message driver. Han.hui GPL->Ver 2.0
5 semaphore file driver. Han.hui GPL->Ver 2.0
6 timerfd driver. Han.hui GPL->Ver 2.0
7 hstimerfd driver. Han.hui GPL->Ver 2.0
8 signalfd driver. Han.hui GPL->Ver 2.0
9 gpiofd driver. Han.hui GPL->Ver 2.0
10 blk io driver. Han.hui GPL->Ver 2.0
11 epoll driver. Han.hui GPL->Ver 2.0
12 hotplug message driver. Han.hui GPL->Ver 2.0
13 procfs driver. Han.hui GPL->Ver 2.0
14 share memory driver. Han.hui GPL->Ver 2.0
15 random number generator. Han.hui GPL->Ver 2.0
16 pty driver (device node). Han.hui GPL->Ver 2.0
17 pty driver (host node). Han.hui GPL->Ver 2.0
18 tty driver. Han.hui GPL->Ver 2.0
19 VxWorks memory device driver. Han.hui GPL->Ver 2.0
20 VxWorks pipe driver. Han.hui GPL->Ver 2.0
21 stream pipe driver. Han.hui GPL->Ver 2.0
22 FAT12/16/32 driver. Han.hui Dual BSD/GPL->Ver 1.0
23 tpsFs driver. Jiang.Taijin GPL->Ver 2.0
24 ramfs driver. Han.hui GPL->Ver 2.0
25 romfs driver. Han.hui GPL->Ver 2.0
26 NFSv3 driver. Han.hui Dual BSD/GPL->Ver 1.0
27 yaffs2 driver. Han.hui GPL->Ver 2.0
28 CAN Bus driver. Wang.feng GPL->Ver 2.0
29 virt touch driver. Zhang.Xu Dual BSD/GPL->Ver 1.0
30 graph frame buffer driver. Han.hui GPL->Ver 2.0
31 net event message driver. Han.hui Dual BSD/GPL->Ver 1.0
32 socket driver v2.0 Han.hui GPL->Ver 2.0
33 virtual net device driver. Han.hui Dual GPL->Ver 2.0
34 net bridge management driver. Han.hui Dual BSD/GPL->Ver 1.0
35 net bonding management driver. Han.hui Dual BSD/GPL->Ver 1.0
36 xinput driver. Han.hui GPL->Ver 2.0
37 demo driver. GeWenBin GPL->Ver 2.0
[root@sylixos:/root]#
可以看到最后的37号驱动是我们加载的demo驱动。