没有合适的资源?快使用搜索试试~ 我知道了~
前言12目录 23项目架构初探 43.1系统架构 43.2硬件说明 43.3代码路径 43.4功能说明 43.5任务分解 53.6内核驱动模块初探 53.6.1
资源推荐
资源详情
资源评论
1
1 前言
从事嵌入式行业多年,虽然因为工作原因接触过嵌入式 Linux,也参与过相关产品的底层和应用功能
开发,但对于嵌入式 Linux 的内核,驱动,以及上层开发,没有系统深入的去总结整理,随着工作年限的
递增,越来越感受到这种浮躁感带来的技术瓶颈。发现了问题,自然就要去解决,回想起踏入嵌入式行业
以来的经历,正是对单片机,网络的学习总结笔记支撑我走到如今的地步,那么沉淀下来,从嵌入式 Linux
入门开始整理,层层深入,进行系统的总结也突破瓶颈的最后办法,这也是本系列的由来。
嵌入式 Linux 的掌握学习是很复杂的过程,从最基础的 Linux 安装,shell 指令的学习和应用,交叉编
译环境搭建,C 语言开发,Uboot 驱动和应用开发,Linux 内核裁剪和驱动开发,设备树维护和修改,Linux
系统接口访问和应用开发,在掌握了前面所有知识后,对于完整的产品,也只是对应项目的基础构建部分,
对于具体的产品,可能还需要电力电子,网络,音视频图像,声音处理等专业方向的技术知识,这些技术
知识不仅是学习的难点,对于系统/软件版本引发的编译,调试问题,复杂应用中的异常处理问题,多线程
/进程应用中的同步问题以,及涉及行业的 CMOS 驱动,LCD,WIFI,蓝牙等的调试开发经验,单纯用文
字描述很难清晰,往往只有动手实践,遇到问题去理解总结才能掌握,这就对从业者有了更高的要求。
嵌入式 Linux 是一门应用开发技术,多练多总结积累技术经验的唯一方法。这行业需要耐心和不断的
努力,在开发中遇到问题要保持良好的心态,积极思考,善于使用搜索引擎,论坛以及其它从业朋友的分
享中找到解决问题的办法,但解决问题只是目的之一,如何从这些方法中总结经验,并用于以后的开发中,
也是整个过程中的重要部分,这部分对于初学者尤其重要。
对于大部分的入门者来说,都是按照如下的流程,从 uboot,驱动,内核开始,先学习外设模块,在
理解如何注册字符型设备,然后按照从易到难的顺序在掌握中断和时钟,文件系统,块设备,I2C 驱动,
LCD 驱动,摄像头驱动,网络设备驱动,设备树,然后在学习涉及多线程和多进程,QT 界面,远程访问
的网络 socket(B/S, C/S 框架),以及应用端的 Android 平台开发等知识,这也是大部分开发板或者教程
的学习方案,可从我经验来看,如果按照上面的流程是可以覆盖嵌入式 Linux 的主要工作需求,但是从产
品实践的角度来说,这些技术都还是 Linux 基础的范畴(基础不代表简单),而不是具体的产品方案; 事实上,
对于刚入门的开发者来说,如何从学习思维转变为工程思维这部分也同样重要,从更高维的角度了解嵌入
式 Linux 开发,这也是本系列的目的。我们先制定一个产品目标(可能不符合真正的产品模型),所有学习
都围绕着此产品来开发。这个系列将不仅仅讲述学习嵌入式,而且也讲述工作中积累的开发经验,如何完
成项目的思考,也方便了解嵌入式软件开发的工作是什么,这部分也是目前嵌入式开发资料中比较欠缺的
经验分享。
对于本系列中可能存在的问题,如需要反馈,
可通过 QQ: 1107473010 或者对应 QQ 邮箱联系。
也可以通过我个人知乎 https://www.zhihu.com/people/wuzhidexingfu 查看分享的嵌入式相关回答和
文章。
2
2 目录
1 前言 ................................................................................................................................................................... 1
2 目录 ................................................................................................................................................................... 2
3 项目架构初探 ................................................................................................................................................... 4
3.1 系统架构 ............................................................................................................................................... 4
3.2 硬件说明 ............................................................................................................................................... 4
3.3 代码路径 ............................................................................................................................................... 4
3.4 功能说明 ............................................................................................................................................... 4
3.5 任务分解 ............................................................................................................................................... 5
3.6 内核驱动模块初探 ............................................................................................................................... 5
3.6.1 参考资料 ................................................................................................................................... 5
3.6.2 必选接口 ................................................................................................................................... 5
3.6.3 可选接口 ................................................................................................................................... 5
3.6.4 模块间的调用 ........................................................................................................................... 7
3.6.5 编译错误和解决办法 ............................................................................................................... 9
4 Linux 系统命令和交叉编译 ........................................................................................................................... 10
4.1 Linux 常用命令整理 ........................................................................................................................... 10
4.2 交叉编译环境构建 ..............................................................................................................................11
4.3 uboot 编译和测试 ............................................................................................................................... 13
4.4 Linux 内核编译 ................................................................................................................................... 14
4.5 基于 Busybox 的文件系统编译 ......................................................................................................... 15
4.6 mgtool 文件下载更新 ......................................................................................................................... 17
4.7 单步更新的方法说明 ......................................................................................................................... 18
4.7.1 nandflash 的单步更新 ............................................................................................................. 18
4.7.2 emmc 的单步更新 ................................................................................................................... 21
4.8 总结 ..................................................................................................................................................... 21
5 LED 驱动开发 ................................................................................................................................................ 22
5.1 参考资料 ............................................................................................................................................. 22
5.2 LED 硬件接口和 DTS 设备树 ........................................................................................................... 23
5.2.1 硬件原理图 ............................................................................................................................. 23
5.2.2 设备树实现 ............................................................................................................................. 23
5.2.3 对设备树的操作 ..................................................................................................................... 24
5.3 Linux 内核加载和删除接口 ............................................................................................................... 26
5.4 设备创建和释放 ................................................................................................................................. 26
5.5 设备访问的接口 ................................................................................................................................. 29
5.6 Makefile 编译和模块加载 .................................................................................................................. 31
5.7 测试代码实现 ..................................................................................................................................... 31
5.8 总结 ..................................................................................................................................................... 32
6 设备树的说明 ................................................................................................................................................. 33
6.1 设备树综述 ......................................................................................................................................... 33
6.2 设备树语法 ......................................................................................................................................... 34
6.2.1 #include 语法 ........................................................................................................................... 34
3
6.2.2 节点描述 ................................................................................................................................. 34
6.2.3 节点属性 ................................................................................................................................. 36
6.3 设备树在驱动中应用 ......................................................................................................................... 40
6.3.1 内核设备树访问函数 ............................................................................................................. 40
6.4 总结 ..................................................................................................................................................... 42
7 Uart 通讯和协议实现 ..................................................................................................................................... 43
7.1 Uart 通讯实现 ..................................................................................................................................... 43
7.2 通讯协议的制定 ................................................................................................................................. 46
7.2.1 协议制定 ................................................................................................................................. 46
7.2.2 数据处理 ................................................................................................................................. 49
7.3 总结 ..................................................................................................................................................... 53
8 附录 ................................................................................................................................................................. 54
8.1 如何自学嵌入式 Linux ....................................................................................................................... 62
8.1.1 嵌入式工作详解 ..................................................................................................................... 62
8.1.2 嵌入式学习计划 ..................................................................................................................... 63
8.2 嵌入式 Linux 问题总结 ...................................................................................................................... 65
8.2.1 系统问题 ................................................................................................................................. 65
8.2.2 编译或执行失败问题 ............................................................................................................. 66
4
3 项目架构初探
3.1 系统架构
任何项目的开发都应该是从框架构建开始的,根据用户的需求,将功能组件分解为具体的模块任务,
最后组合起来,进行完整的应用测试。如何将项目分解成具体的任务分配当然是重要的知识,这部分的完
成是需要对市场需求,SOC 性能(工作频率,容量,外设参数, 功耗等),硬件架构等技术支撑的,这也是项
目经理的主要工作,不过这里就不在深究,先把定义项目中本地管理中的内容分离出来,就得到了如下的
精简框架, 这也是后续几个章节主要实现的应用模型。
3.2 硬件说明
正点原子的 I.MX6U-ALPHA 开发平台,512MB(DDR3)+8GB(emmc)核心板。
涉及硬件 RS232,GPIO,I2C,SPI
3.3 代码路径
https://github.com/zc110747/remote_manage
3.4 功能说明
结合上面的框图需求,需要分为上位机和下位机两个部分的实现,具体需求如下:
1. 上位机软件支持界面化管理(确定使用 QT 开发), 带串口通讯,双机通讯需要制定协议(可使用自定义
协议或者 Modbus)。
2. 下位机支持常用的外设,设置和读取 GPIO,并能够获得 RTC,各类传感器,ADC 等的参数信息。
5
3. 支持文件传输,文件传输支持断点重传(传输后文件位于指定文件夹,初步定义为/usr/download)
4. 支持后期的扩展
3.5 任务分解
1. 工作平台构建,包含 uboot,内核和文件系统的编译,下载和调试,并集成 ssh 方便传输应用文件
调试。
2. 下位机驱动的开发调试,不过为了方便测试及后期集成,需要同步完成串口驱动,串口通讯协议定
义及上位机的软件框架
3. 后期的综合性功能调试和应用开发(如协议扩展问题,状态查询到界面显示,后期该数据可能用于
网页界面的状态显示或者下位机 QT 界面的控制, 需要考虑到协议数据的复用)。
3.6 内核驱动模块初探
本节作为整个系列的起点,重点当然是上面的项目规划和任务分解,不过既然是嵌入式相关的学习,
练习当然十分重要,适应 Linux 平台下的开发和编译习惯也是重要的能力之一。对于嵌入式的驱动开发, 其
实就是配置和操作硬件,并提供一套 API 接口用于内核访问的过程。对于实现的驱动模块,可以通过在内
核编译时直接加入,也可以通过 insmod/rmmod 动态的加载到系统中。为了满足 Linux 系统的访问,开发
者只要按照规则用 C 语言实现这些需要的接口,在按照一定的规则编译后,就可以使用 lsmod/rmmod 来
加载和移除驱动模块,这套规则就是我们掌握内核模块需要学习的知识,下面来熟悉 Linux 初步探究驱动
模块吧。
3.6.1 参考资料
宋宝华《Linux 设备驱动开发详解 -- 基于最新的 Linux4.0 内核》第四章 Linux 内核模块
3.6.2 必选接口
模块加载函数:
module_init(func)
模块卸载函数:
module_exit(func)
模块许可声明:
MODULE_LICENSE("xxx") 支持的许可有:
"GPL", "GPL V2", "GPL and additional right", "Dual BSCD/GPL", "DUAL MPL/GPL", "Pr
oprietary"
3.6.3 可选接口
模块参数 -- 模块加载时传递变量 module_param(name, charp, S_IRUGO);
剩余66页未读,继续阅读
资源评论
章满莫
- 粉丝: 30
- 资源: 316
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功