硬件Driver位于Kernel space中,这部分实现和Linux Driver的flow一样:
① 定义并实现file_operation
结构体
② 将file_operation
结构体注册进内核
③ 创建设备节点
经过编译到内核之后,Android HAL就可以open dev/led打开设备获得handle,进而来调用file_operation函数。
以下逐一讲解:
file_operation
结构体定义file_operation结构体,这里只是定义了open和控制函数,ioctl函数用来控制LED的亮灭
static struct file_operations leds_ops = {
.owner = THIS_MODULE,
.open = leds_open,
.unlocked_ioctl = leds_ioctl,
};
硬件定义:
static int led_gpios[] = {
EXYNOS4212_GPM4(0),
EXYNOS4212_GPM4(1),
EXYNOS4212_GPM4(2),
EXYNOS4212_GPM4(3),
};
file_operation
结构体注册进内核有两种注册方法:
第一种:
static int leds_init(void)
{
//注册file_operation结构体并获取设备号
major = register_chrdev(0, DEVICE_NAME, &leds_ops);
// 创建类,udev会自动创建节点
led_class = class_create(THIS_MODULE, DEVICE_NAME);
// 创建类下的设备
device_create(led_class, NULL, MKDEV(major, 0), NULL, DEVICE_NAME); // /dev/100ask_led0,1,...
return 0;
}
// 将static int leds_init(void)声明为入口函数
module_init(leds_init);
第二种:动态注册
#define DEVICE_NAME "leds_4412"
#