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	0x10b0MX6UL_PAD_JTAG_MOD__GPIO1_IO10	0x10b0MX6UL_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设备了。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/767392.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity类银河恶魔城学习记录11-4,5 p107 Stash for materials源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili ItemData_Equipment.cs using System.Collections; using System.Collecti…

PyQT5学习--新建窗体模板

目录 1 Dialog 2 Main Window 3 Widget Dialog 模板&#xff0c;基于 QDialog 类的窗体&#xff0c;具有一般对话框的特性&#xff0c;如可以模态显示、具有返回值等。 Main Window 模板&#xff0c;基于 QMainWindow 类的窗体&#xff0c;具有主窗口的特性&#xff0c;窗口…

tauri应用实现一键快速更新版本

tauri应用实现一键快速更新版本 创建一个项目 pnpm create tauri-app根据配置选择就可以 pnpm tauri dev启动项目 ##更新配置 打包配置在src-tauri/tauri.conf.json 修改打包命令 "bundle": {"active": true,"targets": "all",&qu…

谷粒商城——Redisson看门狗

可重入锁&#xff1a; 看门狗机制&#xff1a;(lock.lock()不设置过期时间就会自动触发 看门狗机制) 如果一个线程已经上锁后&#xff0c;在运行的过程中中断导致未释放锁从而导致其他线程无法进行&#xff0c;为此需要为每个锁设置自动过期时间。但是如果线程运行时间较长&am…

Learn OpenGL 25 法线贴图

为什么要引入法线贴图 我们的场景中已经充满了多边形物体&#xff0c;其中每个都可能由成百上千平坦的三角形组成。我们以向三角形上附加纹理的方式来增加额外细节&#xff0c;提升真实感&#xff0c;隐藏多边形几何体是由无数三角形组成的事实。纹理确有助益&#xff0c;然而…

Linux进程地址空间详解

文章目录 前言一、程序地址空间二、感受虚拟地址的存在三、进程地址空间四、程序从磁盘加载到内存的过程4.1 物理地址和虚拟地址的区别 五、写时拷贝5.1 解释fork()函数有两个返回值 前言 我们在学习C/C的时候用到的地址是什么地址呢&#xff1f;虚拟地址&#xff1f;物理地址&…

Java基础【上】韩顺平(反射、类加载、final接口、抽象类、内部类)

涵盖知识点&#xff1a;反射、类加载、单例模式、final、抽象类、接口、内部类&#xff08;局部内部类、匿名内部类、成员内部类、静态内部类&#xff09; P711 反射机制原理 创建如下目录结构&#xff0c;在模块下创建src文件夹&#xff0c;文件夹要设置为Sources文件夹&…

红桃写作方便吗 #学习方法#微信#微信

红桃写作是一个非常好用的论文写作工具&#xff0c;它不仅方便快捷&#xff0c;而且非常靠谱&#xff0c;能够帮助用户轻松完成论文写作任务。不论是学生还是专业人士&#xff0c;都可以通过红桃写作轻松地完成论文的写作工作&#xff0c;大大提高工作效率。 首先&#xff0c;红…

【docker常用命令】

1. 什么是docker Docker 是一种开源的容器化平台&#xff0c;用于开发、交付和运行应用程序。它允许开发人员将应用程序及其依赖项&#xff08;如库、环境变量、配置文件等&#xff09;打包到一个被称为容器的标准化单元中。这个容器包含了一切应用程序需要运行的所有内容&…

Python编程—Ajax数据爬取

Python编程—Ajax数据爬取 ​ 在浏览器中可以看到正常显示的页面数据&#xff0c;而使用requests得到的结果中并没有这些数据。这是因为requests获取的都是原始HTML文档&#xff0c;而浏览器中的页面是JavaScript处理数据后生成的结果&#xff0c;这些数据有多种来源&#xff…

使用 Suno 创作歌曲

Suno 是一款基于人工智能的音乐创作工具&#xff0c;可以帮助您轻松创作原创歌曲。 它可以根据您的歌词生成旋律、和弦和伴奏&#xff0c;并提供多种风格和情绪供您选择。 在本文中&#xff0c;我们将介绍如何使用 Suno 创作歌曲。 我们将使用以下步骤&#xff1a; 选择客制化…

windows 系统下(nacos1.x) nacos-1.1.3 链接数据库 mysql8.0 出错分析

** windows 系统下&#xff08;nacos1.x&#xff09; nacos-1.1.3 链接数据库 mysql8.0 出错分析 ** 1、首先以下方法亲测无效&#xff1a; 1&#xff09;需要在数据库 URL 链接配置信息中 添加 allowPublicKeyRetrievaltrue 无效 db.url.0**&allowPublicKeyRetrievalt…

算法-最短路径

图的最短路径问题是一个经典的计算机科学和运筹学问题&#xff0c;旨在找到图中两个顶点之间的最短路径。这种问题在多种场景中都有应用&#xff0c;如网络路由、地图导航等。 解决图的最短路径问题有多种算法&#xff0c;其中最著名的包括&#xff1a; 1.迪杰斯特拉算法 (1).…

AWTK T9 输入法实现原理

1. T9 输入法的中文字典数据 网上可以找到 T9 输入法的中文字典数据&#xff0c;但是通常有两个问题&#xff1a; 采用 GPL 协议&#xff0c;不太适合加入 AWTK。 只支持单个汉字的输入&#xff0c;不支持词组的输入。 经过考虑之后&#xff0c;决定自己生成 T9 输入法的中…

Mamba复现与代码解读

文章目录 环境配置demo推理源码解析参数解读Mamba块&#xff08;Mamba Block&#xff09;状态空间模型(SSM)选择性扫描算法&#xff08;selective_scan&#xff09;前向传播&#xff08;forward&#xff09; 均方根归一化 &#xff08;RMSNorm&#xff09;残差块&#xff08;Re…

集成学习 | 集成学习思想:Boosting

目录 一. Boosting思想1. Adaboost 算法1.1 Adaboost算法构建流程1.2 sklearn库参数说明 2. Gradient Boosting 算法2.1 Gradient Boosting算法构建流程2.2 Gradient Boosting算法的回归与分类问题2.2.1 Gradient Boosting回归算法均方差损失函数绝对误差损失函数 2.2.2 Gradie…

【Linux】进程地址空间详解

前言 在我们学习C语言或者C时肯定都听过老师讲过地址的概念而且老师肯定还会讲栈区、堆区等区域的概念&#xff0c;那么这个地址是指的物理内存地址吗&#xff1f;这里这些区域又是如何划分的呢&#xff1f; 我们在使用C语言的malloc或者C的new函数开辟空间时&#xff0c;开辟…

解锁隐私计算力量:一站式掌握SecretFlow安装与双模式部署实践

1.SecretFlow的安装 1.SecretFlow运行要求 SecretFlow作为一个隐私保护的数据分析和机器学习框架&#xff0c;其运行要求可能涉及以下方面&#xff1a; 操作系统&#xff1a; 能够支持Docker运行的环境&#xff0c;因为SecretFlow可能通过Docker容器来管理执行环境的一致性和…

Python Flask 自定义404错误

from flask import Flask, abort, make_response, request, render_templateapp Flask(__name__)# 重定向到百度 app.route(/index, methods["GET", "POST"]) def index():if request.method "GET":return render_template("index.html&q…

推荐一款制造执行系统(MES)国内比较好的实施厂家

什么是MES 制造执行系统&#xff08;MES&#xff09;是一种用于监控、控制和优化制造过程的软件系统。它通过与企业资源计划&#xff08;ERP&#xff09;系统和自动化系统的集成&#xff0c;实现对生产过程的管理和监测&#xff0c;包括生产计划、生产过程和生产数据。 MES可…