嵌入式linux应用的制作与固件烧录的概述

仅概述, 不对细节进行过多描述(不同的芯片平台,细节也会略有不同,多说无益)。文章只有一个目的,就是对于新接触linux SOC平台的人,帮助他们明确目标,清晰思路,以便更迅速的切入到工作中;

很明显,为了让一个芯片工作起来,芯片需要程序。

一、关于嵌入式linux的SOC,芯片里到底烧录了哪些程序?又是如何制作这些程序的?

二、用户的驱动程序在哪里?如何加载的?用户的应用程序在哪里?如何自启动的?

三、应用程序编写过程中如何在芯片平台上debug?程序如何固化到芯片上?

 

固件包含:  uboot、LOGO、dtb以及kernel文件系统?

首先,针对第一个问题,嵌入式linux的SOC,整体架构,从操作的步骤上划分,可以分为三大块,也可以理解为,有三大块程序需要固化(烧录),

1. U-boot的固化

(虽然,LINUX内核也有引导代码,但是U-boot可以提供更便利的debug与updata,所以牺牲一些启动速度是值得的。市面上大多数的SOC是有U-boot的);

作为新人,对U-BOOT有点陌生,是正常的。即使这样,也不建议过多的去阅读/了解U-boot。除非,工作的本身就是U-boot的维护及个性化升级。为什么不建议去深入研究U-boot呢,原因很简单,通常厂商会提供适用的源码、编译步骤、固化工具/步骤;所以,新平台,你需要做的,就是耐心的读完厂家的操作指南;关于u-boot,在99%以上的应用场合里,是一个几近于标准不需要使用者做出修改的。

 

2. linux内核固化

对linux-kernel进行必要的裁剪或加载用户自己的驱动;听起来,好怕怕的样子。事实上,厂商也提供了linux-kernel源码及工具。里面还包含了平台本身硬件资源对应的驱动,譬如 SPI,USB-HOST,OTG,IIC等等,傻瓜式的编译,傻瓜式的勾选配置。裁剪就完成了。高大尚的说辞,瞬间被拉低了身价;所以,需要你做的是,有耐心的读完厂商提供的操作指南,这个指南会告诉你,如何去编译这个内核原码,生成镜像文件,固化到芯片里。

虽然,操作如此傻瓜,但是我们还应该稍稍了解点基本常识。linux是一个一体化的内核(一体化内核也称“宏内核”相对于“微内核”-例如,uCOS-II,PSOS,VxWork);“一体化”三个字隐隐透露出这玩意,移植是相当"方便"的(至于如何从0开始移植,只有傻冒才会去做,除非你要干的就是这个活儿。敲黑板,敲黑板,敲黑板,厂家已经提供了与芯片相匹配的 linux-kernel源码了,应该在这个源码的基础上去继续深耕才是正道儿)。

linux内核采用模块化设计,功能模块(驱动层)先编译成模块,然后可以在内核运行中动态的加载/卸载而不需要重启;

linux内核集成了完整的POSIX网络协议栈,网络功能完善;

其他的一些稳定性强,安全性好,支持设备广泛等等一些张嘴就来优点,就不再描述了。随便说,反正不会错就对了。

那么linux-kernel有哪些作用呢?或者说有啥组成的呢?又或者说它能干点嘛?

上个结构图看一下。如下图:

                         

上图里的所有的功能模块,基本就是字面意思,也没啥深入要说的了。但是,有一个叫 “文件系统”的模块,敲黑板,敲黑板,上图的 第二行,“文件系统”。这个文件系统,是用户自制作的。也就是本段落开始的时候说的,“需要固化三大块程序”中的一个;详述如下“ 3.”。

3.根文件系统的固化

从上图看,linux内核里有一个单元叫“文件系统” ,linux启动后期,会去寻找并挂载根文件系统;然后,执行里面指定的程序及其他等等。。。简而言之这玩意很重要。需要运行的根文件系统可以是固化在芯片内部的(作为产品,肯定要固化到芯片里面),也可以是存在于芯片内存的镜像(显然掉电,重启内存里数据就丢失了。);根文件系统它包含了linux正常运行所必须的程序、库、各种配置参数等;

刚刚在第“2.”中提到的厂商提供的内核源码。是指,除了“文件系统”以外的所有的东西。所以,开发者,需要自己制作一个文件系统;开发者编写的应用程序(bin),驱动程序(.ko)也都存放在这个文件系统里的。

综上述,制作一个完整的linux SOC需要 制作个U-boot镜像( 这是容易的),制作个linux核的镜像(也算不复杂),制作个根文件系统镜像(如何制作根文件系统,需要了解linux根文件系统的目录结构(大多数时候,业内基本上是按照FHS--文件层次标准--来执行的))这里不做详细描述;

 

其次,针对第二个问题,做如下描述:

值得强调的是“linux驱动程序”与“linux应用程序”是有区别的。驱动加载后运行在内核态,属于内核部分,应用程序运行在用户态;在编程时,它们的编写格式/风格也是有区别的而且区别很大,这里不赘述细节。

为了实现某个产品的功能,在一个完整的应用中,有可能会需要用到“用户自定义的驱动程序+用户的应用程序+标准驱动模块”,也可能仅仅只需要“用户应用程序+标准驱动模块”。

现在说的重点是,如果需要用到自定义的驱动程序时,那么调试好的驱动程序( .KO文件),放在哪里,如何加载到内核中?换句话说,如何固化这个驱动程序呢?

驱动程序,与应用程序都是存放在根文件系统下的。应用程序,通过配置文件可以开机自启动。驱动程序也可以通过脚本来加载。显然,应用程序,自定义的驱动,配置文件,脚本等等都可以在制作文件体系生成镜像文件前,就存放在文件体系中,生成镜像时便包含在镜像文件里。固化到芯片里就可以了。

 

第三、关于Debug

交叉编译环境,宿主机开发; 我们可以把目标板上的文件系统建立在主机上,通过tftp或其他方式,让宿机挂载这个文件系统;所以,修改主机上的这个文件体系内容,实质上就是修改了目标机上的文件体系内容;提供了相对便捷的debug的方式;调试成功后,把这个文件体系打包制作成镜像文件,固化到芯片中就可以了。(固化工具,方法,步骤,供应商同样也有指导说明。需要耐心阅读).

 

附:

SoC基本概念
  SoC的定义多种多样,由于其内涵丰富、应用范围广,很难给出准确定义。一般说来, SoC称为系统级芯片,也有称片上系统,意指它是一个产品,是一个有专用目标的集成电路,其中包含完整系统并有嵌入软件的全部内容。同时它又是一种技术,用以实现从确定系统功能开始,到软/硬件划分,并完成设计的整个过程。从狭义角度讲,它是信息系统核心的芯片集成,是将系统关键部件集成在一块芯片上;从广义角度讲, SoC是一个微小型系统,如果说中央处理器(CPU)是大脑,那么SoC就是包括大脑、心脏、眼睛和手的系统。国内外学术界一般倾向将SoC定义为将微处理器、模拟IP核、数字IP核和存储器(或片外存储控制接口)集成在单一芯片上,它通常是客户定制的,或是面向特定用途的标准产品。
  SoC定义的基本内容主要表现在两方面:其一是它的构成,其二是它形成过程。系统级芯片的构成可以是系统级芯片控制逻辑模块、微处理器/微控制器CPU 内核模块、数字信号处理器DSP模块、嵌入的存储器模块、和外部进行通讯的接口模块、含有ADC /DAC 的模拟前端模块、电源提供和功耗管理模块,对于一个无线SoC还有射频前端模块、用户定义逻辑(它可以由FPGA 或ASIC实现)以及微电子机械模块,更重要的是一个SoC 芯片内嵌有基本软件(RDOS或COS以及其他应用软件)模块或可载入的用户软件等

Linux驱动之SOC内部和外设

从事嵌入式软件的骨子里总带着那么点硬件的影子,比如写个程序会计较一下RAM、ROM占用,编译结果等等。当然写嵌入式应用软件的可能不太在乎。

Linux驱动开发是个既清晰有很模糊的事。清晰是指,Linux系统内核和架构都是定型的,当你拿到一份内核源码时,只要按照套路做就是了。很模糊是指很少人能讲清楚这个套路是什么,细节方面怎么做。很多讲Linux驱动开发的书最后把自己也绕进去了。

Linux驱动开发应该参照类似单片机驱动开发的套路——单片机驱动可以分为内部驱动和外设驱动:

1、内部驱动就是单片机内部控制器驱动一般通过改单片机的寄存器实现,所谓的驱动却大部分都是对寄存器改动、打包、互相调用。当然这部分工作越来越依赖于半导体厂商了,当然这也是他们份内的事,单片机是他们设计、制造的,要说写内部驱动会有比他们写的更好的吗?现在厂家都按照意法半导体的模式了,直接提供内部驱动给你省事多了。

2、外设驱动套路就是通过上面写好的内部驱动去读写外设的寄存器、互相调用等。这在单片机领域很常见啊,比如ESP8266外设驱动不就是通过单片机内部串口驱动按照串口时序去读写ESP8266寄存器吗。在外设驱动里我们都会发现里面肯定有单片机内部驱动,比如读取ESP8266某值的函数肯定有单片机内部驱动uart_read。说个题外话,为什么外设制造商不直接提供一份驱动?“臣妾做不到啊!”,鬼才知道你用什么单片机!最多给你提供几个应用广的单片机适配的驱动。单片机供应商更加不会考虑你用什么外设。反正不就是一个套路:外设驱动里包含单片机内部驱动,了事。

3、你真的掌握了这个套路了吗?在单片机没有那么深的套路里内部驱动和外部驱动一目了然。可是扔到SOC+Linux里呢?这就复杂了首先SOC内部驱动在2.6-3版本内核时是platform(驱动设备总线)套路;其次外设除了包含内部驱动这个套路,还有个更上层的套路就是驱动设备总线模型;然后大家伙就晕了。把两套驱动设备总线混在一起了,但其实它们的交互API是很直接的,也就是它们各自分别实现各自的驱动设备总线模型,然后通过外设包藏内部驱动,搞定。

4、但外设驱动那有那么简单,还有很多子系统框架呢?但它们与platform其实没有关系了。Linux只是希望外设驱动在包藏和调用内部驱动时能更有套路罢了。

5、写Linux驱动书的人总是不愿意太Low的说套路这个词,其实慢慢的都是套路,把套路讲清楚了也是真本事!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值