嵌入式Linux移植5. LED驱动移植 添加LED驱动到内核,测试程序成功运行

2023-11-18

第一次尝试开发移植Linux上的驱动,还是和当年单片机一样,从最简单的LED小灯开始,走走流程

试验结果:LED驱动已经编译进系统(产生.o文件),LED测试程序已经编译成功(产生可执行文件),但是由于疫情手头没板子,没法上板测试,开学之后测试吧。写的有点乱想到哪写哪吧,自己能看懂就行吧,有不懂的朋友可以留言。

 

内核源码:飞凌提供的的kernel源码

目标板:飞凌的ok335xd,am3354

试验前提:已经有了LED驱动程序ledcdev.c

                                LED测试程序myledapp.c

移植涉及的主要7个文件:1.以上两个.c文件

                                          2.在内核文件中的drivers/misc/下新建myled文件夹,其中新建文件Kconfig,Makefile

                                          3.myled上层目录(misc)中的Kconfig,Makefile文件

                                          4..config文件,kernel总目录下的,靠menuconfig界面改,可vi查看添加结果/搜索指令

语法了解:Makefile语法和基本规则

                  Kconfig语法和基本规则

基本思想:驱动程序与测试程序分离,先编写驱动程序,添加到内核文件,将驱动编译进内核;然后编写测试程序,编译,启动                    系统,将编译完的可执行文件通过NFS移进板子,运行文件,测试程序运行

                  Kconfig,Makefile,menuconfig,.config关系理解:

                  Makefile和Kconfig是Linux中重要的两条线,上级的Kconfig,Makefile调用下级的Kconfig,Makefile,Kconfig中写的东  西                    要在menuconfig中的菜单里显示,Makefile决定哪些文件要进行编译。

                  有了驱动改好这四个文件(上级下级共四个)后在menuconfig中启用设备驱动,Kconfig中写的东西要在menuconfig                      中的菜单里显示,menuconfig中设置完之后改变kernel下的.config文件,Makefile根据.config文件决定将led的驱动程                       序编译进系统。

基本流程: 驱动程序移植

                 1.在misc中新建myled文件夹,在其中通过vim新建Kconfig,Makefile

                  2.在myled下的Kconfig,Makefile写入对应代码(具体写法此文不进行赘述)

                  3.在myled上层目录即/drivers/misc文件中的Kconfig,Makefile中写入对应代码(路径和编译成.o的指令)

                  4.kernel文件下 make menuconfig进入界面找到myled选项,选上*,退出保存,vi .config,查看是否有MYLEDTEST

                  5.驱动移植完毕,编译内核

                  6.使用tftp,将刚编译生成的uImage复制到/tftpboot

                  7.使用NFS,使用NFS挂载网络根文件系统,Ubuntu的/nfs_rootfs作为根文件目录

                  8.复位板子,自动加载新编译的内核

                  添加测试程序                  

                 1.编写测试程序,编译生成可执行文件

                 2.将可执行文件文件移到ubuntu下的/nfs_rootfs/mnt

                 3.使用超级终端操作板子:root       cd /mnt    ./ledtest

                 4.闪灯实现

关键指令注意事项:

                       编辑mytestapp:  gedit myledapp.c
              查看交叉编译器版本:arm-arago-linux-gnueabi-gcc -v
编译LED测试程序myledapp.c:  arm-arago-linux-gnueabi-gcc -o ledtest myledapp.c
                                 编译内核:make CROSS_COMPILE=arm-arago-linux-gnueabi- ARCH=arm uImage

关于Makefile和Kconfig:

make menuconfig  进入配置界面(在内核文件夹下)

vi Makefile   :打开Makefile进行编辑,没有的话,自动新建一个进行编辑
vi ../Makefile:打开上一级的。。。。。。
vi Kconfig    :打开Kconfig进行编辑,没有的话,自动创建一个进行编辑
vi ../Kconfig : 打开上级的。。。。

vim操作注意事项:

更全的查看:https://blog.csdn.net/qq_36071362/article/details/104372454
1.如果操作滚轮和方向键有ABCD,卸掉vim装vim,以下方法

        方法2:ubuntu预装的是 vim tiny,安装vim full版本,可以解决

        卸载vim-tiny:

        $ sudo apt-get remove vim-common

        安装vim full:

        $ sudo apt-get install vim

2.不同模式切换:刚进入是命令模式,按“i”键进入输入模式进行编辑
                编辑完成后按esc,输入:进入命令模式
                输入wq保存退出(还有q! wq!强制退出,q,w)
3./搜索指令

 

没图不舒服:附上阶段性成果图片

图1-2:menuconfig界面中出现我们的设备,选用设备

            注意取消选中飞凌的驱动,在misc-led device

            注意device driver里的LED Support不要改,LED Support for GPIO connected LEDs选项与飞凌板的LED有关,没有自己的驱动myled和飞凌的led device可以通过执行echo 1 > /sys/class/leds/usr0/brightness亮灯,但是没有LED Support无法操作LED,简单分析:飞凌的驱动是封装的LED Support,里面有设备号的自动注册,之后测试程序根据设备号操作LED。文件系统/dev/led是设备文件,内核启动后驱动会操作led文件

遗留问题1:LED Support到底做了什么?怎么做的?

遗留问题2:文件系统中的led文件,能否自建文件?什么类型和内容?

图3. .config中出现。。。=y

图4. 驱动程序中编译出来.o文件(随系统内核一块编译出来的)

图5. 测试程序使用同样的交叉编译器编译成ledtest可执行文件(单独编译,在移进文件系统,超级终端操作运行)

图6.测试成功,小灯闪烁

       历史性时刻,使用的是自己编译的内核,自己移植过来的驱动,

       虽然驱动照抄飞凌的,只是在内核中换了个位置

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式Linux移植5. LED驱动移植 添加LED驱动到内核,测试程序成功运行 的相关文章

  • 【异常】RuntimeError: Failed to process string with tex because latex could not be found

    1 异常描述 RuntimeError Failed to process string with tex because latex could not be found RuntimeError Failed to process st
  • GLSL-WebGL着色器语言语法详解

    GLSL语法 GLSL它是强类型语言 每一句都必须有分号 它的语法和 typescript 挺像 GLSL的注释语法和 JS 一样 变量名规则也和 JS 一样 不能使用关键字 保留字 不能以 gl webgl 或 webgl 开头 运算符基
  • < Linux >:Linux 环境基础开发工具使用 (3)

    目录 一 Linux 调试器 gdb 的使用 1 1 背景 1 2 开始使用 1 3 理解 二 Linux项目自动化构建工具 make与Makefile makefile 2 1 背景 2 2 项目结构 三 Linux 系统中第一个小程序
  • 生活当中调整时钟时间背后发生的事情

    生活当中调整时钟时间背后发生的事情 我们在生活当中想要设定时钟 手表的时间的事情 我们通过会和大多数人一样 会按照手机上的时间来设定 但是 这背后发生了什么事情 我想大部分人应该是不知道的 其实我们自己的时间是自动设定 每隔一阵子 我们的手
  • springboot集成pagehelper

    1 导入pom xml
  • postman调用参数是对象

    写了一个controller 需要用postman调通测试一下 请求参数是vo controller 端口号是1213 postman调用时传入对象的方式如下
  • STC15单片机-低功耗设计

    低功耗设计 STC15省电模式 数据手册有介绍 STC15系列单片机可以运行3种省电模式以降低功耗 它们分别是 低速模式 空闲模式和掉电模式 正常工作模式下 STC15系列单片机的典型功耗是2 7mA 7mA 而掉电模式下的典型功耗是 lt
  • SpringBoot实现微信支付,微信扫码支付,Native支付(全网最详细教程)

    1 添加微信支付依赖
  • ICCV、ECCV、CVPR三大国际会议

    目录 前言 一 ICCV ECCV CVPR是什么 1 ICCV 2 ECCV 3 CVPR 二 三大会链接及论文下载链接 前言 作为刚入门CV的新人 有必要记住计算机视觉方面的三大顶级会议 ICCV CVPR ECCV 统称为ICE 与其
  • 【论文翻译】文本语义提取

    摘要 文本文档是存储信息的手段之一 这些文档可以在个人桌面计算机 内部网和Web上找到 因此 有价值的知识以非结构化的形式嵌入 拥有一个可以从文本中提取信息的自动化系统是非常可取的 然而 开发这样一个自动化系统的主要挑战是自然语言并不是没有
  • geth生成钱包地址

    配置Geth 博主是Ubuntu18 04 所以 sudo apt update sudo add apt repository ppa longsleep golang backports sudo apt update sudo apt
  • 宏定义与逻辑运算学习笔记

    宏定义 宏定义又称为宏代换 宏替换 简称 宏 格式 define标识符 字符串 其中的标识符就是所谓的符号常量 也称为 宏名 掌握 宏 概念的关键是 换 即在对相关命令或语句的含义和功能作具体分析之前就要换 例 define PI 3 14
  • Tracy 小笔记 Vue - Vue 数据的响应式原理

    变量如果是对象的话 那么需要给对象先定义好属性 才能响应式 因此需要提前定义好所需的属性 如 info name 11 value 22 添加属性 如果想要再之后添加属性的话还想要响应式的话 有如下两种方式 使用 Vue set 这个可以是
  • errcode = 40163; errmsg = "code been used"(提供一种解决思路)

    最近在做微信开发 就在开发完毕测试的时候 遇到一个大问题 每次新用户进入的时候就报错 错误基本上就是code been used 我去百度了好久 没有找到合适的方案 后来我仔细的看了一下微信开发文档 终于解决了 注 该方法不一定对所有人有效
  • C语言中关键字const、static、volatile的用法分析

    1 const 作为一个程序员 我们看到关键字const时 首先想到的应该是 只读 因为 它要求其所修饰的对象为常量 不可对其修改和二次赋值操作 不能作为左值出现 看几个例子 const int a 同上面的代码行是等价的 都表示一个常整形
  • TCP 、UDP、IP包的最大长度是多少?

    对于UDP协议来说 整个包的最大长度为65535 其中包头长度是65535 20 65515 对于TCP协议来说 整个包的最大长度是由最大传输大小 MSS Maxitum Segment Size 决定 MSS就是TCP数据包每次能够传 输

随机推荐

  • 数据回归算法

    文章目录 效果一览 文章概述 源码设计 参考资料 效果一览 文章概述 数据回归算法 Matlab实现逐步回归预测模型 逐步回归 Stepwise Regression 其基本思想是将变量逐个引入模型 每引入一个预测变量 解释变量 后都要进行
  • 作为一个Java程序员,深入java虚拟机第四版

    第一阶段 架构师筑基必备技能 我觉得 但凡是个成年人应该都清楚扎实的基本功对自己的工作帮助有多重要 从各大招聘网站的招聘要求来看 第一条都明确说明需要扎实的Java基础 因此 一般笔试以及面试的第一轮 对基础的考察是比较多的 其实我发现有很
  • 如何写一个随机洗牌函数

    看到了很多人写得随机洗牌函数 但是感觉写得都不是太好 自己写了一个试试 基本要求 给定一定范围的数比如最大值最小值 min max 在这个之间进行随机洗牌 首先生成一个按min到最大的max的数组a 对数组进行循环 每次随机生成一个要取的下
  • c++ 中ref 和引用的区别

    c 中 本身可以使用 来实现引用 那为什么还会出现ref 呢 ref int f2 int c c cout lt lt in function c lt lt c lt
  • Java基础 (三):LinkedList(含使用方法详解)

    Java LinkedList 链表 Linked list 是一种常见的基础数据结构 是一种线性表 但是并不会按线性的顺序存储数据 而是在每一个节点里存到下一个节点的地址 链表可分为单向链表和双向链表 一个单向链表包含两个值 当前节点的值
  • 放大倍数超5万倍的Memcached DDoS反射攻击,怎么破?

    欢迎大家前往腾讯云 社区 获取更多腾讯海量技术实践干货哦 作者 腾讯游戏云 背景 Memcached攻击创造DDoS攻击流量纪录 近日 利用Memcached服务器实施反射DDoS攻击的事件呈大幅上升趋势 DDoS攻击流量首次过T 引发业界
  • Java实现对数据库的查操作

    查询数据库得到的结果有很大的可能会得到若干条 因此executeQuery 方法的返回值是一个集合 返回类型由ResultSet接收 数据库的增删改操作 在JDBCUtils工具类中对close方法进行方法重载 public static
  • 【Spark NLP】第 7 章:分类和回归

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • 2.VHDL的基本结构和语法(一)

    目录 1 VHDL基本结构 1 1 实体 Entity 类属说明 端口方向 IN OUT INOUT BUFFER 1 2 结构体 Architecture 1 3 库 程序包的调用 1 4 VHDL语句 1 4 1 并行语句 并行信号赋值
  • web项目读取resource目录下的资源

    本地读取资源文件 1 方式 File file new File src main resources properties basecom properties InputStream in new FileInputStream fil
  • 关于ScrollView嵌套多个RecyclerView滑动冲突,可以很流畅的滑动

    首先不建议过多的嵌套 可以采取其他方式替换 当ScrollIView内部只有一个RecyclerView的时候
  • 【HTML】基础常用标签汇总

    目录 前言 最基础的标签 常用标签 文本相关 文本格式化标签 图像标签 超链接 表格 列表 无序列表 有序列表 自定义列表 表单 基本结构 表单域 表单元素控件 前言 总所周知 一个网站 web 分为三部分 1 HTML 结构 2 CSS
  • 2022年最新Vue+electron项目创建

    一 前言 大多数文章都停留在electron vue中 但是这个库不怎么更新了 最近的更新是九月前 看了很多文章都换其他的工具来构建了 这里推荐GITHUB一个大佬写的基于vue cli的插件 构建项目非常简单 插件的GITHUB源代码 话
  • 力扣刷题26. 删除有序数组中的重复项

    采用双指针法 思路如下 class Solution public int removeDuplicates int nums if nums length 0 return 0 int p 0 int q 1 while q
  • 【华为OD机试真题2023B卷 JAVA&JS】选修课

    华为OD2023 B卷 机试题库全覆盖 刷题指南点这里 选修课 知识点字符串哈希表排序 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 现有两门选修课 每门选修课都有一部分学生选修 每个学生都有选修课的成绩 需要你找出同时选
  • OCaml学习笔记(二)——Introduction to Objective Camel

    Chapter2 Simple Expressions 2 1 注释语句 OCaml语言中注释部分写在 和 之间 可以相互嵌套 注释部分当作空格处理 2 2 基本表达式 OCaml中每个有效的表达式都有一个类型 某个类型的表达式不能用作其他
  • 使用 Microchip SAM9X60 OTP 存储板卡的MAC地址和序列号

    1 介绍 SAM9X60 处理器有部分OTP One Time Programming Aera 可用于存储user data 这样的话我们就可以将板卡 MAC Address和 SN 序列号写到固定的OTP User Area中 为什么要
  • Python--根据计算公式:BMI = 体重(kg) / 身高(m)^2判断身体状况

    Python 根据计算公式 BMI 体重 kg 身高 m 2判断身体状况 身体质量指数 BMI Body Mass Index 是国际上常用的衡量人体肥胖程度和是否健康的重要标准 主要用于统计分析 肥胖程度的判断不能采用体重的绝对值 它天然
  • ajax将响应结果显示到iframe,JavaScript:iframe / Ajax / JSON

    iframe 在Ajax流行之前大量使用 iframe中的src属性指定的就是一个独立的页面url地址 iframe中呈现的就是这个页面的内容 通过改变src的值 我们就可以轻松的改变iframe中的内容 类似的 刷新验证码也是同样的手段
  • 嵌入式Linux移植5. LED驱动移植 添加LED驱动到内核,测试程序成功运行

    第一次尝试开发移植Linux上的驱动 还是和当年单片机一样 从最简单的LED小灯开始 走走流程 试验结果 LED驱动已经编译进系统 产生 o文件 LED测试程序已经编译成功 产生可执行文件 但是由于疫情手头没板子 没法上板测试 开学之后测试