一、基础知识
想把系统自带的led驱动使用起来,必须先启用这个配置
在内核根目录下,输入make menuconfig即可打开图形化配置界面
选择当前项并启动,输入y选中,输入n取消选中
vi .config看下配置文件。复习下vi指令,ctrl+F下一页,ctrl+B前一页,G文档末尾,gg文档首行,nG(n是数字)移动到第n行,/向前查找,?向后查找,n继续查找
重新编译内核 make
看一些内核自带的led驱动,下面是路径
匹配成功会运行驱动结构体中的的probe函数
可以看出module_platform_driver是一个宏 展开来看 里面还是宏
下面把 这两个宏连接起来,先替换__driver,在替换__registr,在替换__unregister
static int __init gpio_led_driver_init(void)
{
return platform_driver_register(&(gpio_led_driver) , ##__VA_ARGS__);
}
module_init(gpio_led_driver##_init);
static void __exit gpio_led_driver##_exit(void)
{
platform_driver_register(&(gpio_led_driver) , ##__VA_ARGS__);
}
module_exit(gpio_led_driver##_exit);
VA_ARGS 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。
实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。这里不使用,删掉即可
下面来把这个led配置为系统心跳led
首先修改设备树,在根节点下增加
dtsleds {
compatible = "gpio-leds";
led0 {
label = "red";
gpios = <&gpio1 3 GPIO_ACTIVE_LOW>;
linux,default-trigger = "heartbeat";
default-state = "on";
};
};
重新编译设备树 make dtbs
然后拷贝到tftp目录里,sudo cp arch/arm/boot/dts/imx6ull-alientek-nand.dtb /home/zys/linux/tf
tpboot/ -f
再把linux系统也编译了,因为之前打开了led的配置嘛,直接make
将zImage拷贝到tftp,sudo cp arch/arm/boot/zImage /home/zys/linux/tftpboot/ -f
重启开发板 可以看到红色的led在跳动