1.led点亮查询设备树中led的节点找到匹配的compatible属性根据compatible属性查找内核的led驱动代码查询到内核驱动代码为leds/leds-gpio.c阅读内核的led驱动代码发现驱动只获取了gpio的属性信息其控制led亮灭是靠gpio子系统来进行的查询内核的led设备树查询板子上的led原理图、可以看到led的引脚为PE10,PF10,PE8现在需要在设备树中写出这几个led的属性信息首先查询设备树的写法在说明书中grep default-state * -nRlabel : 该 LED 的标签。如果省略标签将取自节点名称不包括单元地址。它必须唯一标识一个设备即其他 LED 类设备不能被分配相同的标签。default-state : LED 的初始状态。有效值为 on开、off关和 keep保持。如果 LED 已经处于开启或关闭状态并且 default-state 属性设置为相同的值则不应产生导致 LED 瞬间关闭或开启的毛刺glitch。keep 设置将保持 LED 处于当前状态而不会产生毛刺。如果不存在此属性默认值为 off关。在我们的板子相关的设备树中搜gpio属性怎么写在说明书中搜索grep gpio-cells * -nr | grep stm在说明书中找到gpios属性应该怎么写的说明在设备树中写好我们的led节点高电平有效初始状态offgpio子系统控制亮灭2.混杂设备什么是混杂设备混杂设备Misc Device通常用于那些主设备号Major Number统一为 10但拥有不同次设备号Minor Number的小型、简单的硬件驱动。因为要将led注册到混杂设备下为了不修改内核代码导致通用的led驱动匹配不上其他的led设备重新编写led驱动混杂设备结构体使用混杂设备时你只需要关心并赋值前三个成员minor、name 和 fops然后将这个结构体传入 misc_register() 函数即可完成设备注册。int minor;次设备号作用标识这个具体的混杂设备。特点因为所有混杂设备的主设备号都是10由内核预留所以内核靠minor来区分不同的设备。常用值如果你指定了具体的数字如 1, 2, 3...内核就会分配对应的次设备号。如果你将其赋值为MISC_DYNANIC内核就会自动帮你分配一个未使用的、空闲的次设备号现代驱动开发强烈推荐这种方式。const char *name;设备名称作用决定该设备在/dev/目录下生成的设备节点名称。示例如果你设置为led系统启动后就会在/dev/下生成一个/dev/led的设备文件用户空间就可以通过open(/dev/led)来操作它。const struct file_operations *fops;文件操作集合作用指向file_operations结构体的指针里面包含了用户空间对该设备执行标准文件操作时对应的回调函数。示例用户调用read()时内核会调用fops-read()用户调用ioctl()时内核会调用fops-unlocked_ioctl()。这是驱动实现业务逻辑的核心入口。先开辟空间存放结构体在probe函数中获取每个led的gpio描述符使用devm_gpiod_get函数其传入的第二个参数为const char *con_id连接标识符即字符串用于在设备树中匹配具体的 GPIO 属性名。在设备树DTS中GPIO 属性通常以 -gpios 结尾。内核会自动将 con_id 和 -gpios 拼接起来进行查找。例如如果你传递 reset内核就会去设备树中查找名为 reset-gpios 的属性。例如如果你传递 NULL内核就会去查找名为 gpios 的属性。第三个参数enum gpiod_flags flags的作用用于在获取 GPIO 的同时指定其初始状态方向和初始电平。常用的标志包括GPIOD_ASIS (或 0)保持原状。不改变 GPIO 的方向和电平后续再手动设置。GPIOD_IN输入模式。将 GPIO 初始化为输入。GPIOD_OUT_LOW输出低电平。将 GPIO 初始化为输出并拉低电平逻辑低。GPIOD_OUT_HIGH输出高电平。将 GPIO 初始化为输出并拉高电平逻辑高。赋值前三个成员minor、name 和 fops使用misc_register传入赋值后的结构体将设备注册到混杂设备中写设备树安装驱动在dev目录下在sys/class/misc目录下在/proc目录下cat misc3.基于I2C与IIO子系统读写传感器数据原理图板子相关设备树中查询grep i2c1 * -nr在内核的driver/i2c目录下搜索这个compatible属性查看控制器驱动代码
阅读完成 · 觉得有帮助?