嵌入式Linux驱动开发(五)设备树下的LED驱动开发

1. 设备树LED驱动原理

旧方法:在驱动文件中定义有关寄存器物理地址并使用ioremap进行内存映射,对得到的虚拟地址进行操作。
新方法:通过OF函数获取设备树中的属性值,然后传递给内核初始化相关IO。

2. 步骤

1)修改设备树文件:
  在根节点下面创建如下子节点:

 alphaled {
 	/*address和size是约束子节点的,没有子节点其实可以不写*/
	#address-cells = <1>;
	#size-cells = <1>;
	compatible = "atkalpha-led";
	status = "okay";
	reg = < 0X020C406C 0X04 	/* CCM_CCGR1_BASE */
			0X020E0068 0X04 	/* SW_MUX_GPIO1_IO03_BASE */
			0X020E02F4 0X04 	/* SW_PAD_GPIO1_IO03_BASE */
			0X0209C000 0X04 	/* GPIO1_DR_BASE */
			0X0209C004 0X04 >; 	/* GPIO1_GDIR_BASE */
};

  编译设备树,然后放到nfs文件夹下。如果报错“unable to parse input tree”,先检查Makefile里ARCH和COM那个有没有写,然后“make defconfig”。

make dtbs
/*不行就用这个*/
make imx6ull-alientek-emmc.dtb

  启动内核后在设备树下查看。
在这里插入图片描述
2)LED驱动:
  重点在于驱动入口函数中关于设备树的处理,通过OF函数实现:

static int __init led_init(void)
{
	/* 获取设备树中的属性数据 */
	/* 1、获取设备节点:alphaled */
	dtsled.nd = of_find_node_by_path("/alphaled");
	/* 2、获取 compatible 属性内容 */
	proper = of_find_property(dtsled.nd, "compatible", NULL);
	/* 3、获取 status 属性内容 */
	ret = of_property_read_string(dtsled.nd, "status", &str);
	/* 4、获取 reg 属性内容 */
	ret = of_property_read_u32_array(dtsled.nd, "reg", regdata, 10);

	/* 寄存器地址映射 */
	IMX6U_CCM_CCGR1 = of_iomap(dtsled.nd, 0);
	SW_MUX_GPIO1_IO03 = of_iomap(dtsled.nd, 1);
	SW_PAD_GPIO1_IO03 = of_iomap(dtsled.nd, 2);
	GPIO1_DR = of_iomap(dtsled.nd, 3);
	GPIO1_GDIR = of_iomap(dtsled.nd, 4);
	......
}

3)测试:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值