Led控制从内核到app的实现之驱动层(一)

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文件来编译文件

你可能感兴趣的:(Led控制从内核到app的实现之驱动层(一))