深圳市航顺芯片技术研发有限公司
直播中

李娜

7年用户 1584经验值
私信 关注
[问答]

怎样去移植通用嵌入式系统呢

怎样去移植通用嵌入式系统呢?

Linux在嵌入式中有何应用?

回帖(1)

陈炜

2021-10-20 17:42:57
  01嵌入式基本概念,嵌入式开发环境搭建,目标机搭建,TFTP服务搭建,NFS服务搭建
  1.系统移植概述及环境搭建
  1.通用嵌入式系统软件组成部分
  无os嵌入式系统组成图
  
  有os嵌入式系统组成图
  
  2.Linux 在嵌入式中应用的条件与前景
  嵌入式系统越来越追求数字化、网络化和智能化。这就要要求整个嵌入式系统必须是开放的、提供标准的API,并且能够方便地与众多第三方的软硬件沟通。
  Linux是在GPL协议下开放源码的系统,内核可以定制剪裁、功能强大、支持多种文件系统、网络功能及其强大、非常适合高端嵌入式系统。
  更重要的是 linux 不仅仅支持X86体系结构的cpu,还支持众多的体系结构的 cpu/mcu。
  Android 系统最初就是基于linux-2.6.23的。硬件基本要求 armv5 ARM926EJ-S 200Mhz 64M
  3.嵌入式Linux内核结构
  
  4.Android系统
  
  2.嵌入式开发环境搭建
  1.嵌入式Linux交叉开发环境硬件基本组成
  开发主机(Host)
  目标机(Target)
  连接介质
  
  
  
  2.开发板启动流程
  
  3.搭建嵌入式Linux开发环境的主要工作
  准备开发主机、目标机(开发板)以及二者的连接介质
  准备目标机代码
  安装交叉工具链
  开发主机上安装的软件(为方便调试)
  终端软件(putty、minicom)
  tftp服务
  nfs服务
  目标机安装(u-boot烧写调试)SD卡方式 Fastboot方式 (成功后,板子有串口信息输出)
  主机和目标机能联通
  网络自动 tftp 加载内核,并挂载nfs rootfs 启动
  4.开发主机搭建
  ubuntu环境
  
  5.TFTP 服务
  
  主机端tftp服务器配置
  
  
  6.NFS 服务
  
  
  
  7.目标机安装(u-boot烧写调试) – 需要SD卡
  制作SD卡,并从SD卡启动 (使用的是2010版本u-boot,支持fastboot烧写的)
  将sdfuse_q 拷贝到Linux下
  将SD卡插入电脑并识别
  进入sdfuse_q执行如下操作
  $ sudo 。/mkuboot.sh /dev/sdb 出现下面的信息,表示SD启动盘制作成功
  Fuse FS4412 trustzone uboot file into SD card/dev/sdb reader is identified.u-boot-fs4412.bin fusing.。.1029+1 records in1029+1 records out527104 bytes (527 kB) copied, 5.31834 s, 99.1 kB/su-boot-fs4412.bin image has been fused successfully.Eject SD card 关闭开发板电源,将拨码开关SW1调至(1000)(SD启动模式)
  刚才做好的SD启动盘插入SD卡插槽
  打开电源
  8.fastboot烧写
  连接USB线到板子上的USB OTG口 连接串口线到板子的COM2口 重启板子,并快速停下,在串口终端输入下面命令 /* 如果有有需要,可以格式化 eMMC 并创建分区 $ fdisk -c 0 $ fatformat mmc 0:1 $ ext3format mmc 0:2 $ ext3format mmc 0:3 $ ext3format mmc 0:4 */ $ reset 重启切换到2010版的sd卡启动 $ fastboot //会提示装驱动,选中第一天_环境搭建里的fastboot_driver 安装 打开dos终端 进入USB_fastboot_toolplatform-tools目录输入 》 fastboot.exe flash bootloader u-boot-fs4412.bin /* 同理可以烧录其它镜像 》 fastboot.exe flash kernel zImage 》 fastboot.exe flash ramdisk ramdisk-uboot.img 》 fastboot.exe flash system system.img 》 fastboot -w */ 关闭开发板电源,将拨码开关SW1调至0110(EMMC启动模式)后打开电源 从flash 的u-boot启动 /* 如果启动失败,可以通过拨号开关恢复到SD卡方式启动 如果启动成功,想恢复到原来的u-boot启动 (第一次输入reset后会自动切换回去,不用拔拨号开关) */
  IP地址设置
  板子能ping通虚拟机 (要关闭防火墙 网卡右键高级)
  |板子 192.168.2.10 |
  --------------------------
  ------------------------
  |电脑 192.168.2.112 | //做中转用,和板子虚拟机IP要在同一网段, 且不能和它们IP一样
  ------------------------
  ------------------------
  |虚拟机 192.168.2.231 |
  确认板子和电脑是能通信的
  设置电脑网卡ip 为192.168.2.112 255.255.255.0 192.168.9.1
  启动板子,快速按任意键停在boot处,设置u-boot 的环境变量
  #setenv serverip 192.168.2.231 //注意它与虚拟机里 ubuntu 的ip要一致#setenv ipaddr 192.168.2.10#setenv gatewayip 192.168.2.1 #pri 查看设置后效果
  FS4412 # pribaudrate=115200bootargs=root=/dev/nfs nfsroot=192.168.9.120:/nfs/rootfs rw console=ttySAC2,115200 clk_ignore_unused init=/linuxrc ip=192.168.9.9bootcmd=tftp 41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000bootdelay=3ethact=dm9000ethaddr=11:22:33:44:55:66gatewayip=192.168.2.1ipaddr =192.168.2.10netmask=255.255.255.0serverip=192.168.2.231 #ping 192.168.2.231
  测试网络是否连通 ,注意在u-boot中, 它能ping电脑, 电脑不能ping它 ,注意,要拔掉jtag线,否则ping 会重启
  host 192.168.2.231 is alive //is alive 表示ok
  确认电脑和虚拟机时能通信
  编辑 -》 虚拟网络编辑器 -》 VMnet0 桥接到(选连板子的网卡) //注意不要用automic,应手动指定对应的网卡
  虚拟机 -》 设置 -》 网卡适配器 -》 自定义 (选 VMnet0)
  使虚拟机内的虚拟网卡,关联到电脑实际用到的网卡
  通过选VMnet0 和 VMnet1 。实现连板子,还是上internet的切换
  网络自动 tftp 加载内核,并挂载nfs rootfs 启动
  设置tftp方式加载内核
  setenv bootcmd tftp 41000000 uImage;tftp 42000000 exynos4412-origen.dtb;bootm 41000000 - 42000000
  setenv bootcmd 设置环境变量(自启动命令 bootcmd)
  tftp 41000000 uImage; 通过tftp从虚拟机/tftpboot目录下下载内核uImage到板子的内存 41000000 处。 ; 用于分割多个命令
  tftp 42000000 exynos4412-origen.dtb 通过tftp下载设备树文件 exynos4412-fs4412.dtb 到板子的内存 42000000 处
  bootm 41000000 - 42000000 启动内核(41000000处放的是内核uImage, 42000000处放的是设备树文件)
  挂载nfs rootfs
  setenv bootargs root=/dev/nfs nfsroot=192.168.2.231:/nfs/rootfs rw console=ttySAC2,115200 clk_ignore_unused init=/linuxrc ip=192.168.2.10
  setenv bootarg 设置环境变量( bootarg是启动参数)
  root=/dev/nfs 指定根文件系统类型是 nfs
  nfsroot=192.168.2.231:/source/rootfs 指定source rootfs的位置 (是在ip 是192.168.2.231的机器上 ,的/source/rootfs目录下)。 注意/nfs/rootfs必须和前面NFS服务配置文件设置一致
  savenenv //保存环境变量
  掉电重启动板子 看能否挂载nfs rootfs成功
  能看到下面信息表示成功
  [root@farsight ]# ls
  etc linuxrc proc ***in tmp var
  bin dev lib mnt root sys usr
  在里面创建文件,电脑的/nfs/rootfs上同步变化
  02Bootloader移植(bootloader基本概念,U-boot常用命令和配置编译
  1.Bootloader 介绍
  1.什么是Bootloader
  Bootloader是硬件启动的引导程序,是运行操作系统的前提;
  在操作系统内核或用户应用程序运行之前运行的一小段代码。对软硬件进行相应的初始化和设定,为最终运行操作系统准备好环境;
  在嵌入式系统中,整个系统的启动加载任务通常由Bootloader来完成。
  2.Bootloader的特点
  Bootloader不属于操作系统,一般采用汇编语言和C语言开发。需要针对特定的硬件平台编写。
  在移植系统时,首先为开发板移植Bootloader。
  Bootloader不但依赖于CPU的体系结构,而且依赖于嵌入式系统板级设备的配置。
  3.Bootloader的操作模式
  自启动模式:在这种模式下,Bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入。
  交互模式:在这种模式下,目标机上的Bootloader将通过串口或网络等通信手段从开发主机(Host)上下载内核映像和根文件系统映像等到RAM中。可以被 Bootloader写到目标机上的固态存储媒质中,或者直接进行系统的引导。也可以通过串口接收用户的命令。
  2.常用bootloader介绍
  
  3.U-boot介绍
  u-boot(Universal Boot Loader)是德国DENX小组开发的用于多种嵌入式CPU的bootloader程序。遵循GPL条款。
  从FADSROM、8xxROM 、PPCBOOT、Armboot逐步发展演化而来;
  当前版本号:参考Makefile。
  U-boot的特点:
  代码结构清晰、易于移植(见目录结构)
  支持多种处理器体系结构(见arch目录)
  支持众多开发板(目前官方包中有200多种,见board目录)
  命令丰富、有监控功能
  支持网络协议、USB、SD等多种协议和设备
  支持文件系统
  更新较活跃,使用者多,有助于解决问题
  4.U-boot命令介绍
  命令分类
  环境设置、数据传输、存储器访问、加载运行
  1.printenv 显示所有环境变量
  ORIGEN # pri
  
  2.setenv 设置新的环境变量
  ORIGEN # set myboard FS4412 ORIGEN # pri
  
  3.saveenv 将当前定义的所有的环境变量值存入flash中
  
  4.tftp 通过网络下载程序
  U-boot # setenv ethaddr 11:22:33:44:55:66 //设置开发板的物理地址
  
  U-boot # setenv ipaddr 192.168.2.10 U-boot # setenv serverip 192.168.2.231 U-boot # tftp 41000000 application.bin U-boot # tftp 41000000 zImage 5.protect 对Nor Flash写保护
  protect on 0 10000 对区间[0x0, 0x10000]进行写保护protect off 0 10000 对上述区间取消写保护 6.erase 擦除Nor FLASH
  erase all 擦除FLASH所有的扇区erase 0 10000 把FLASH区间 [0x0, 0x10000]擦除 7.Nand相关命令
  nand read addr off sizenand write addr off sizenand erase [clean] [off size] NAND flash和NOR flash的区别详解
  NAND flash按块访问和NOR flash按字节访问
  NAND flash必须先擦出后写
  8.movi 命令
  eMMC
  movi init —初始化eMMC并显示相关信息movi read u-boot/kernel addr //读u-boot或读kernel,可以选择movi write u-boot/kernel addrmovi read rootfs addr sizemovi write rootfs addr size 9.bootcmd 自启动命令
  如果定义了该变量,在自启动模式下将会执行该环境变量中的命令。
  将文件通过tftp自动下载到指定的地址
  U-boot # setenv bootcmd tftp 41000000 uImage; bootm 41000000
  U-boot # saveenv
  
  bootargs 是uboot传递给内核到启动参数,是一个字符串console=xxx: 告诉内核启动时候到调试信息是从哪个设备输出,这里是串口2init=xxx: 告诉内核linux到第一个用户进程是什么root=xxx : 告诉内核根文件系统在哪里root=/dev/nfs 表示根文件系统在网路远端nfsroot=(开发板)ip:path rw 其中rw表示可读可写ip=xxx :(Ubuntu ip)告诉内核开机的时候内核的ip地址是多少(静态分配ip)
  
  10.bootm kernel-addr ramdisk-addr dtb-addr
  引导内核为内核传参,其中内核和ramdisk通常为mkimage处理过的二进制文件。
  从这个地址处自动启动程序
  
  11.go addr
  执行内存中的二进制代码,简单的跳转到指定地址(运行裸机程序)
  5.U-BOOT 配置编译
  1.U-Boot目录结构
  平台相关
  arch, board, include…
  平台无关
  common, net, fs, drivers…
  工具和文档
  tools, doc
  
  2.编译U-boot
  U-boot的编译
  整个工程通过Makefile来组织编译。顶层目录下的Makefile中包含了开发板的配置信息。从顶层目录开始递归地调用各级子目录下的Makefile,最后链接成u-boot映像。
  顶层目录下的 Makefile
  它负责u-boot整体配置和编译
  在Makefile中指定使用的交叉工具链
  配置u-boot: make origen_config
  编译: make
  使用build.sh编译
  linux@linux:~/u-boot-2013.01-fs4412$ 。/build.sh
  U-BOOT编译生成的映像文件
  
  3.U-boot镜像下载烧录
  烧录编译产生的镜像 u-boot.bin
  初次或开发板代码损坏不能正常启动时,可采用JTAG工具烧录
  专用的烧录工具如h-jtag或DNW等
  在u-boot已经能工作,升级或修正U-boot时,可用U-boot中的命令来烧录
  其它方式 如SD卡 , Fastboot命令
  镜像固化位置
  ROM、NOR FLASH、NAND FLASH EMMC等
  u-boot-fs4412.bin
  u-boot.bin是uboot编译源码后直接产生的,一般的的开发板,直接烧写这个文件就可以了
  但是三星的cortex_a9 exynos4412这款CPU把uboot中一些初始化时钟等的代码剥离出去了,所以,编译好的这个u-boot.bin还要加上被剥离出去的部分,才可以正常使用
  所以在build.sh脚本文件中,在u-boot.bin之前加上了剥离出去的部分后,生成了u-boot-fs4412.bin
  
举报

更多回帖

发帖
×
20
完善资料,
赚取积分