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_operationinitctl成员,他们是由底层chip_demo_gpio.c提供的结构体,这个函数是操作硬件的。再由板级代码board_A_led来制定哪个引脚。把这①②③三个程序编译成一个.ko文件(相互依赖的关系,一个工程)
notion image
 
从零手写Bootloader实现IAP嵌入式C——面向对象编程思想
Loading...