初涉驱动实验

u-boot:启动内核

内核:启动应用   

应用:读写文件,点灯,获取按键

  应用: open,read,write   

c库   

  |ststem call interaface          swi val  根据发生异常的原因,调用处理函数

内核|   

  |驱动 led_open,led_read,led_write      硬件

     

驱动框架:

1、 led_open,led_open........

2、怎么告诉内核   

  a、定义一个file_operations结构,填充   

  b、注册,告诉内核   

  c、谁来调用register_chrdev驱动入口函数

crw-rw----    1 0        0          3, 173 Jan  1 00:00 ttyzd
crw-rw----    1 0        0          3, 174 Jan  1 00:00 ttyze
crw-rw----    1 0        0          3, 175 Jan  1 00:00 ttyzf
crw-rw----    1 0        0          1,   9 Jan  1 00:00 urandom
crw-rw----    1 0        0        253,   0 Jan  1 00:00 usbdev1.1_ep00
crw-rw----    1 0        0        253,   1 Jan  1 00:00 usbdev1.1_ep81
crw-rw----    1 0        0          7,   0 Jan  1 00:00 vcs
crw-rw----    1 0        0          7, 128 Jan  1 00:00 vcsa
crw-rw----    1 0        0         10, 130 Jan  1 00:00 watchdog
crw-rw----    1 0        0          1,   5 Jan  1 00:00 zero

 

c开头的为字符设备

-rw-r--r--    1 1000     1000          210 Dec 26  2015 fstab
drwxr-xr-x    2 1000     1000         4096 Dec 26  2015 init.d
-rw-r--r--    1 1000     1000           53 Dec 26  2015 inittab

-表常规文件

d代表文件目录

 

app: open("/dev/xxx"),read   ,write  

     属性  c  111 主设备号

-----------------|--------------------------------------------

        |   c库

----------------- |------------------------------------------chrdv

      VFS | 0,1,2,3,4......111,.....找到file_operations

------------------|-------------------------------------------内核

------------------|-------------------------------------------

  led_open,led_read,led_write            驱动

---------------------------------------------------------------

驱动程序1、^2、定义^file_operation: open=led_open  write=led_write

3、入口函数用register——chrdev(major,name,^)

 

突然发现编译时不能使用大写字母文件编译时

major = register_chrdev(0, "first_drv", &First_drv_fops);

系统自动分配主设备号

cat /proc/devices      查看设备

mknod /dev/xxx c 252  0    添加设备文件

insmod first_drv.ko      注册驱动

rmmod first_drv.ko     卸载驱动  

1、驱动

a、自动分配设备号

b、手动分配

2、应用程序

a、mknod /dev/xxx c 主  从

    手动

b、自动建立  udev   ,mdev   根据驱动提供系统信息来创建设备节点

firstdrv_class = class_create(THIS_MODULE, "firstdrv");   //´´½¨Àà
firstdrv_class_dev = class_device_create(firstdrv_class, NULL, MKDEV(major, 0), NULL, "xxx"); /* /dev/xxx */

 

 需要添加MODULE_LICENSE("GPL");否者无法注册

 

# cat dev
252:0

# ls
dev        subsystem  uevent

 

-r--r--r--    1 0        0            4096 Jan  1 03:14 dev
lrwxrwxrwx    1 0        0               0 Jan  1 03:19 subsystem -> ../../../class/firstdrv
--w-------    1 0        0            4096 Jan  1 03:19 uevent

 

posted @ 2015-12-28 01:00  CAM&  阅读(259)  评论(0编辑  收藏  举报