type
status
date
slug
summary
tags
category
icon
password
一、从应用程序到驱动程序的过程是:
当应用程序调用
open()
函数打开一个设备节点时,内核会返回一个文件句柄,这个句柄对应一个 struct file
结构体,结构体中记录了文件的相关信息,比如文件偏移量等。此时,此时访问设备文件(如 /dev/xxx
),内核会根据设备的主设备号来判断设备的类型。根据设备的类型(字符设备或块设备),内核会在相应的设备表(
chrdevs
)中查找与主设备号对应的驱动程序。在这个过程中,内核通过主设备号找到驱动程序中的 file_operations
结构体,里面包含了设备的各种操作函数,比如 open()
函数。然后,内核会调用该驱动的 open()
函数,完成设备的初始化工作,允许后续的读写操作。二、开发驱动程序的过程是:
1、确定主设备号,不同类型的设备有不同的主设备号,也可以设为0让内核分配
2、定义自己的 file_operations 结构体
3、实现对应的 drv_open/drv_read/drv_write 等函数,填入 file_operations 结构
体
4、把 file_operations 结构体告诉内核:
register_chrdev(major,name,file_operations)
5、谁来注册驱动程序啊?得有一个入口函数:安装驱动程序时,就会去调用这
个入口函数
6、有入口函数就应该有出口函数:卸载驱动程序时,出口函数调用
unregister_chrdev
7、其他完善:提供设备信息,让系统自动创建设备节点:class_create→
device_create三、驱动设计思想——分层分离过程:
首先APP层需要调用
open
函数,在驱动层有对应的设备的open
函数,驱动怎么写呢,由一个leddrv.c
实现,构造了一个file_operation
结构体,实现里面的open
成员,指向led_drv.open
函数,open
函数要把led配置成输出引脚,write
要把引脚输出高低电平,怎么做到的呢?需要调用底层提供led_operation
的init
和ctl
成员,他们是由底层chip_demo_gpio.c
提供的结构体,这个函数是操作硬件的。再由板级代码board_A_led
来制定哪个引脚。把这①②③三个程序编译成一个.ko文件(相互依赖的关系,一个工程)- 作者:Torah
- 链接:https://tangly1024.com/article/89baba2a-cee7-4836-8990-63b88777d8c3
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。