SylixOS字符设备驱动开发(五)

gewenbin
gewenbin
gewenbin
188
文章
15
评论
2020年12月17日22:37:19 2 1,766

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驱动。

gewenbin
  • 本文由 发表于 2020年12月17日22:37:19
  • 转载请务必保留本文链接:http://www.databusworld.cn/8940.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

评论:2   其中:访客  1   博主  1
    • 陪丫头长大 陪丫头长大 4

      前面葛神说设备即文件,为什么files指令出来的列表数量比devs指令列表还少呢?