ELFBoard编译内核及添加LED驱动

整体编译

  1. config文件
cp arch/arm/configs/imx_v7_mfg_defconfig arch/arm/configs/imx6ull_elf1_defconfig
  1. 设备树文件
cp arch/arm/boot/dts/imx6ull-14x14-evk.dts arch/arm/boot/dts/imx6ull-elf1-emmc.dts
  1. 编译脚本
#!/bin/bash
export CPUS=`grep -c processor /proc/cpuinfo`
source /opt/fsl-imx-x11/4.1.15-2.0.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi
make distclean
make imx6ull_elf1_defconfig
make -j${CPUS}
rm -rf ./.tmp
make modules_install INSTALL_MOD_PATH=./.tmp/rootfs/
cd .tmp/rootfs/

报错:“multiple definition of `yylloc‘; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first”

  • 在根目录下的makefile中添加HOSTCFLAGS += -fcommon

单独编译

  1. 单独编译内核镜像 zImage
elf@ubuntu:~/work/linux-4.1.15-elf1$ make zImage -j4
  1. 单独编译设备树
elf@ubuntu:~/work/linux-4.1.15-elf1$ make dtbs –j4
  1. 单独编译模块
elf@ubuntu:~/work/linux-4.1.15-elf1$ make modules -j4
  • 安装模块到./.tmp/rootfs/文件夹中
elf@ubuntu:~/work/linux-4.1.15-elf1$ make modules_install INSTALL_MOD_PATH=./.
tmp/rootfs/
#打包模块
elf@ubuntu:~/work/linux-4.1.15-elf1$ cd .tmp/rootfs/
elf@ubuntu:~/work/linux-4.1.15-elf1$ tar -jcvf modules.tar.bz2 *

内核编译有用的文件:

  • Image:arch/arm/boot内核原始 bin 格式镜像
  • dtb:arch/arm/boot/dts设备树二进制文件

此外,modules是放在rootfs文件系统中的。

驱动LED

这里直接使用 Linux 系统中自带的 gpio-leds 驱动实现,gpio-leds 通过调用 Pinctrl 子系统和 GPIO 子系统实现 LED 灯的控制。

Pinctrl 子系统主要根据设备树中引脚配置信息配置 IOMUX
GPIO 子系统则主要是提供控制 GPIO 的 API

硬件原理

在这里插入图片描述
与GPIO的对应关系为

  • LED_R --> GPIO1_10
  • LED_G --> GPIO1_00
  • LED_Y --> GPIO1_18

在管脚分配表中找到对应的引脚名
在这里插入图片描述
在这里插入图片描述

因为需要使用这几个引脚控制 led,所以我们需要把它们复用成 GPIO 功能。

在设备树文件 arch/arm/boot/dts/imx6ull-elf1-emmc.dts的&iomuxc 节点下添
加子节点pinctrl_leds0:

pinctrl_leds0:leds0grp {
	fsl,pins = <
		MX6UL_PAD_UART1_CTS_B__GPIO1_IO18	0x10b0
		MX6UL_PAD_JTAG_MOD__GPIO1_IO10	0x10b0
		MX6UL_PAD_GPIO1_IO00__GPIO1_IO00	0x10b0
	>;
};

其中leds0grp为节点,pinctrl_leds0为节点的标签,

具体的引脚描述可以在 imx6ul-pinfunc.h中查看。因为 imx6ull 与 imx6ul 有一些通用的配置,所以就把通用的部分都放到了 imx6ul-pinfunc.h 文件中,然后把差异的部分放到 imx6ull-pinfunc.h 中来描述。

更加详细的描述可以参考《IMX6ULLRM.pdf》32章节的IOMUX Controller。
此章节 IOMUXC Memory Map/Register Definition 中的 IOMUXC 中有两类描述。

  • 一类是 IOMXUC_SW_MUX_CTL_PAD:描述的是复用寄存器
  • 另一类是 IOMUXC_SW_PAD_CTL_PAD:描述的是电气属性寄存器

在设备树中添加完 IOMUX 配置相关代码之后,接下来在设备树中添加供 GPIO 子系统
使用的相关的配置。在根节点的 backlight 节点上边,添加子节点 leds:

leds {
	compatible = "gpio-leds";
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_leds0 >;
	status = "okay";
	led1{
		lable = "led1";
		gpios = <&gpio1 10 GPIO_ACTIVE_LOW>;
		default-state = "off";
	};
	led2{
		lable = "led2";
		gpios = <&gpio1 0 GPIO_ACTIVE_LOW>;
		default-state = "on";
	};
	led3{
		lable = "led3";
		gpios = <&gpio1 18 GPIO_ACTIVE_LOW>;
		default-state = "on";
	};
};

一定要在根节点下添加

  • compatible 属性值为“gpio-leds”,用于驱动匹配。
  • pinctrl-name 属性值为“default”,定义了 pincrtl 的名字为“default”
  • pinctrl-0 的属性值为<&pinctrl_leds0>,就是引用了之前在 IOMUX 中定义的 pinctrl_leds0 也就是说,在此处对 IOMUX 的配置进行了引用,类似函数的调用。
  • status 属性值设置为“okay”,表示 LED 设备可用。
    接下来三个子节点,分别对应三个具体 LED 灯。
  • 子节点的 lable 标签属性是可选的,可有可无。
  • gpios 属性值指定了具体的 GPIO 引脚以及引脚的极性配置。
    如:
    • gpios = <&gpio1 18 GPIO_ACTIVE_LOW>;
      指定是 GPIO1_IO18 引脚,极性是 GPIO_ACTIVE_LOW,就是指高电平点亮还是低电平点亮,需要根据具体电路配合使用。
  • default-state 属性值设置了 LED 初始默认状态。

配置 LED 驱动编译进内核

首先使用 ElfBoard 的配置文件配置编译选项:

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ make imx6ull_elf1_defconfig

然后在源码根目录下使用 make menuconfig 命令,搜索 LEDS_GPIO,看到 LEDS_GPIO [=y]说明此驱动已经编译进内核:

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ make menuconfig

编译测试

编译内核和设备树:

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ ./build.sh

编译完成后,使用 scp 命令将编译生成的 zImage 和 imx6ull-elf-emmc.dtb 下载到 ElfBoard 的/run/media/mmcblk1p1 路径下:

elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/zImage root\@92.168.0.232:/run/media/mmcblk1p1/
elf@ubuntu:~/work/linux-imx-imx_4.1.15_2.0.0_ga$ scp arch/arm/boot/dts/imx6ull-elf1-emmc.dtb root@192.168.0.232:/run/media/mmcblk1p1/

重启后即可在/sys/class/leds/目录下看到我们的LED设备了。
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxfeng~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值