旧程序格式
- 应用程序调用open/write 函数
- 驱动程序提供对应的open/write 函数(led_drv_open作用:调用底层提供的Led_drv_open(指针,底层芯片chip_demo_gpio.c提供的指针)->init成员 把led引脚配置成输出引脚; /led_drv_write作用:调用底层提供的Led_drv_open->ctl成员 把led引脚配置成输出高电平或低电平)
- 具体操作那个引脚,由board_A_led.c指定
- 驱动程序为leddrv.c,注册file_operation结构体(open/wirte成员: open成员指向led_drv_open函数,write成员指向led_drv_write)
新格式结构
注释:上层leddrv.c调用底层(chip_demo_gpio.c)提供的函数(get_board_led_opr),之后得到board_demo_led_opr结构体
两个platform: platform_device & platform_driver(里面有probe函数,该函数做驱动程序相关的事情)
probe作用:
- 从 platform_device 获得资源-即记录资源,有几个引脚,引脚分别是什么
- 对于每个引脚都要调用device_creat(根据平台的资源,来确定创建多少个device)
board_A_led.c: 里面有入口函数,在入口函数注册platform_device
chip_demo_gpio.c:里面有入口函数,在入口函数注册platform_driver
leddrv.c: 入口register_chrdev
写程序
通过两种方式指定资源:1.通过platform_data这个私有数据指定硬件资源 2. 通过resource数组指定硬件资源
- 修改board_A_led.c
- 定义入口函数,并注册platform_device
- 定义出口函数,并注销platform_device
- 使用module_init修饰入口出口函以及 声明模块的许可证
- 定义资源数组
- 定义资源之后,将resource添加到platform_device里面来
- chip_demo_gpio.c
-
定义入口函数,并注册platform_driver
-
定义出口函数,并注销platform_driver
-
使用module_init修饰入口出口函以及 声明模块的许可证
-
构造结构体: 确定platform_driver的成员,name配对之后,调用probe函数,当设备去掉之后调用remove函数
-
实现chip_demo_gpio_led_probe函数,当发现匹配成功之后,下一步记录引脚(先定义数组g_ledpins,定义计数g_ledcnt,后从资源里确定引脚),之后创建device_create。
从资源里确定资源的引脚 通过while循环
创建device_create之前是在上一层(leddrv.c)创建,要把device_create封装到led_device_create函数里面,文件leddrv.c作为ko加载,别的驱动程序想要引用这个函数,则需要把这个函数提前导出来
导出
- 实现chip_demo_gpio_led_remove函数
销毁device_destroy之前是在上一层(leddrv.c),要把device_destroy封装到led_device_destroy函数里面,文件leddrv.c作为 ko加载,别的驱动程序想要引用这个函数,则需要把这个函数提前导出来
leddrv.c
chip_demo_gpio.c
leddrv.c 文件的 led_init函数 调用get_board_led_opr函数,但是get_board_led_opr是在底层chip_demo_gpio.c中实现的,
需要先加载