leddriver.c部分
- 定义file_operation结构体
static const struct file_operations led_fops = {
.owner = THIS_MODULE,
.write = led_write,
};
led_init()
- 定义cdev结构体,用于字符设备描述
static struct cdev led_cdev
- 初始化cdev,建立cdev与file_operation结构体的关联
cdev_init(&led_cdev,&led_fops)
- 注册字符设备
register_chrdev_region(led_cdev.dev,DEVICE_COUNT,DEVICE_NAME)
- 将LED字符设备添加到内核字符设备数组中
cdev_add(&led_cdev,led_cdev.dev,DEVICE_COUNT)
- 创建设备文件(先创建class类 再创建device)
led_class = class_create(THIS_MODULE,DEVICE_NAME)
device_creat(led_class,NULL,led_cdev.dev,NULL,DEVICE_NAME)
// led_cdev.dev 表示设备号
- IO引脚初始化
// GPIO1_A4
#define LED_PIN RK30_PIN1_PA4
gpio_request(LED_PIN, "led");
gpio_direction_output(LED_PIN, GPIO_HIGH);
led_write()
// 通过判断用户空间buff传入的值,实现对引脚高低电平的控制
gpio_set_value(port_num,0/1)
led_exit()
- 卸载设备文件
device_destroy(led_class,led_cdev.dev)
- 卸载类
class_destroy(led_class)
- 注销字符设备
unregister_chrdev_region(led_cdev.dev,DEVICE_COUNT)
- module_init指定驱动初始化程序
module_init(led_init)
- module_exit指定驱动卸载程序
module_init(led_exit)
Kconfig
- 位置 driver/char
config LEDTEST
tristate "LED test for RK3066"
default n
help
this is a LED driver for RK3066
LEDTEST就是新的菜单项,options是在这个新的菜单项下的属性和选项
每个config菜单项都要有类型定义,bool:布尔类型, tristate三态:内建、模块、移除, string:字符串, hex:十六进制, integer:整型
default n 表示默认不编译
- Makefile
方法1.obj-$(CONFIG_LEDTEST)+=leddriver.o
方法2.obj-y+=leddriver.o
makefile会根据Kconfig生成的.config文件来编译文件