应用程序调用glibc函数
内核层大致分为三个源文件
1)drv.c (硬件操作执行)
包含file operation结构体的设置、注册,结构体中包含了.open(),.read()等驱动函数;
- .open()会调用对应的函数led_drv_open();
- led_drv_open()会找到led_operation(此结构体由底层驱动源文件led_gpio.drv.c提供)结构体中某一个成员比如init,此成员的值实际上是对应硬件寄存器操作函数的地址;
- p_led_opr->init(minor, status);根据次设备号和stasus状态参数执行硬件引脚操作,完成硬件驱动。
2)led_gpio_drv.c(硬件操作说明)
包含platform_driver结构体的设置注册,该结构体中包含了.probe()函数,该函数包括了a.从设备节点读取引脚信息并保存,b.调用drv.c文件中的函数创造led设备节点;
当platform_device中的资源与platform_driver匹配时,就会调用probe();
获取引脚信息后,硬件寄存器操作函数board_led_init()书写了对不同寄存器的不同操作;
硬件寄存器操作函数board_led_init()的地址被赋值给led_opr结构体中的init成员;使用指针变量将led_opr的地址返回给drv.c文件
3)board_led.c(硬件资源)
包含了platform_device结构体的设置注册,该结构体中包含了硬件引脚信息资源。
硬件资源来自设备树节点。
若要修改设备树节点,需要找到你的单板所用的设备树文件dts,在它的根节点下添加节点内容,修改编译后得到新的dtb文件。