系统移植笔记总结

tech2022-08-10  135

第一节–环境配置

用到的资源 u-boot-2013.01.tar 提取码:4doo linux-3.14.tar 提取码:w83e rootfs.tar.xz提取码:ho18

系统移植的要点:

搭建交叉开发环境bootloader 移植kernel 移植根文件系统 制作

一:嵌入式框架

app 操作系统 (系统移植) 驱动 (驱动开发) 硬件 (headwear) 嵌入式:冷冰冰的机器(硬件)注入灵魂(软件)

二:环境搭建

1.环境搭建

嵌入式需要嵌入式开发环境, 交叉编译 1)交叉编译工具的安装 gcc-4.6.4/bin 2)tftp的安装和使用 客户机<---->服务器 安装:sudo apt-get install tftpd-hpa tftp-hpa 配置文件-作用: sudo vi /etc/default/tftpd-hpa 重启 sudo service tftpd-hpa restart 3)nfs服务器的使用 共享-[板子/主机|客户端/服务器 nfs: fs,filesystem 文件系统 nfs:网络文件系统 安装: sudo apt-get install nfs-kernel-server 配置: sudo vim /etc/exports 重启 sudo /etc/init.d/nfs-kernel-server restart (or)sudo service nfs-kernel-server restart

2.三大件的移植:

pc: bios ->windows ->文件系统 filesystem:fs andriod: recovery ->andriod ->fs 嵌入式: u-boot ->linux ->fs 三大件: bootloader os ->fs 1):为什么要系统移植?怎样获得三大件(借用其他板子)? 判断两块板子相同: i CPU相同 ii RAM flash 尽可能的相同 iii 外设最好相同 2): 1、交叉编译工具 arm-none-linux-gnueabi-gcc 2、tftp nfs 文件系统

第二节–bootloader

一、bootloader:

为什么需要bootloader: 可以 修复/重装/双系统 升级系统核心功能 bootloader -----> 硬件启动的引导程序 系统移植 首先移植的就是bootloader bootloader操作模式 1自启动模式 2交互模式

bootloader基本功能

初始化硬件--->自搬移--->执行用户命令--->加载内核 详细加载运行操作系统过程: ####开机启动--->执行硬件初始化动作--->进入交互模式/自动模式--->加载os 组成: 汇编 [开机启动 核心硬件初始化(cpu 存储 cache 串口等) 设置堆栈,跳转到C]+ ==> C[大部分硬件初始化 交互模型/自动模式 加载os] 第一阶段 初始化基本硬件(CPU DDR 串口 关看门狗) 自搬移 清BSS段和堆栈(bss段:存一些未初始化的变量 或者 全局变量) 第二阶段 初始化本阶段的硬件(flash 网口) 读取环境变量 如果是自启动模式 直接加载内核 如果是交互模式 接收用户命令

二、嵌入式bootloader

嵌入式bootloader: (u-boot 200KB) u-boot : universal bootloader,通用的 bootloader 既可以跑在PC上,也可以跑在其他的板子上,一般跑在arm ppc 上.

三、u-boot如何使用-----

1、环境变量: FS4412 # printenv baudrate=115200 波特率:可以通过修改这个环境变量配置u-boot波特率 bootargs=root=/dev/nfs nfsroot=192.168.1.166:/home/lsf/src/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.1.123 解释: bootargs: 你告诉内核, 在内核启动过程中的一些参数, 内核再启动过程中,会读取该变量,并执行相应动作 root=/dev/nfs nfsroot=192.168.1.166:/home/lsf/src/rootfs rw console=ttySAC2,115200 告诉内核你起来之后,使用串口2打印,波特率115200 ip=192.168.1.123 如何修改:set bootargs root=/dev/nfs nfsroot=192.168.1.167:/home/lsf/src/rootfs rw console=ttySAC2,115200 init=/linuxrc ip=192.168.1.249 bootcmd=tftp 41000000 uImage;tftp 42000000 exynos4412-fs4412.dtb;bootm 41000000 - 42000000 解释: u-boot如何自己知道加载哪一个os,如何加载os: 需要你告诉他如何去加载os tftp 41000000 uImage; 从tftp服务器下载文件uImage(os 内核)到RAM 41000000地址 tftp 42000000 exynos4412-fs4412.dtb; 从tftp服务器下载文件exynos4412-fs4412.dtb 下载到RAM42000000地址 bootm 41000000 - 42000000 uboot进入自动模式,会依次执行里面的每一条指令 作用:你告诉u-boot如何去加载正确的操作系统 如何修改: set bootcmd tftp 41000000 uImage\;tftp 42000000 exynos4412-fs4412.dtb\;bootm 41000000 - 42000000 bootdelay=1 ##进入交互模式的等待时间1秒 ethact=dm9000 ethaddr=11:22:33:44:55:66 fileaddr 41000000 filesize 2CAFC0 ipaddr=192.168.1.123 ####开发板的ip地址 netmask 255.255.255.0 serverip 192.168.1.166 ####设置tftp服务器的 ip地址 stderr=serial stdin=serial stdout=serial Environment size: 586/16380 bytes ------------

关键字解释

1、命令: printenv 打印环境变量 setenv 设置环境变量 saveenv 保存环境变量 ####在设置环境变量时,需要进行删除,setenv 环境变量名称 空格; saveenv 2、 ipaddr 板端ip地址 serverip 服务器端ip地址(虚拟机地址) ethaddr MAC地址 (一般不用它) ###在使用tftp命令之前 需要开启tftpd-hpa这个服务 3、 tftp 41000000 uImage //该命令会从serverip指定的主机,通过tftp协议,下载uImage文件,到RAM 41000000地址中 bootm :是go的升级版,主要用于执行内核 bootm 内核地址 文件系统地址 设备树地址

第三节-- u-boot的移植:

一、u-boot移植思想

1.架构选择 单板确定 arm exynos fs4412 参考 origen 2.交叉编译 uboot源码目录 交叉编译工具链 Makefile ARCH = arm CROSS_COMPILE = arm-none-linux-gnueabi- 3.boot的编译步骤 make xx_config make make distclean

二、u-boot的移植:

工作量小 简单, 因为u-boot目的是引导操作系统, 只要 核心板起来了,就可以加载os. 外设基本上不用关心. fs4412 => origen 源码: 顶层目录,u-boot一级目录,在该目录下执行编译 等操作.

平台相关的

移植工作需要关注的内容 arch /arm/cpu/xxxx 不同的cpu初始化代码不一样 cpu原厂提供 ##board /samsung/origen 不同的板子初始化代码也是不一样的 开发者关注 ##include/configs /origen.h 不同的板子配置文件也是有差异的 开发者关注 origen.h用于控制整个u-boot的编译动作

平台无关的

比如 ping setenv 等命令,不同的平台 都拥有该功能 网络协议

u-boot的编译:

注意,一定要在顶层目录下编译 且配置交叉编译环境

1.配置 告诉u-boot,你要编译哪一个板子的 make origen_config ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- 2.编译 make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- 3.结果 在顶层目录下生成 u-boot.bin,可以烧写到 flash中去的 4.清空 make distclean u-boot的烧写:在u-boot启动之前,cpu会启动自己的自启程序,自启程序比较强大(启动串口、网卡、sd) 各个厂商的u-boot自启程序不一样的。

第四节–内核、设备树移植

###内核/kernel### uImage-内核的镜像-2M

一、内核编译:

1.配置内核 告诉内核你要编译哪一个板子的内核 cp arch/arm/configs/exynos_defconfig .config 修改配置 make menuconfig ARCH=arm 通过图形化界面 配置, 结果会写回到.config 2.编译内核 make uImage ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- -j4 前提是:sudo cp u-boot/tools/mkimage /bin/ 3.结果: arch/arm/boot Image 5419020-5.2M 正宗的二进制内核镜像,可以直接烧写flash运行 zImage 2763176-2.7MB zipImage Image经过压缩之后的镜像,运行之前需要解压 uImage 2763240-2.7M u-boot专用的zImage, u-boot对zImage进行加工,添加64B的头,生成uImage 4.清空 make distclean ARCH=arm #### but: fs4412使用origen内核,发现启动一半就死了 因为硬件差异 此时: 1.通过make mennuconfig 配置内核,将我们需要的功能天添加进去内核. dm9000的实验[知名 厂商 知名的设备] 2.如果一个##驱动###没有集成在内核中呢???? [你写的驱动 一些小厂商的驱动 ....] 你可以修改内核,将你的驱动加入内核.就可以通过menuconfig来配置和使用. Kconfig 决定如何在menuconfig显示的 修改.config配置文件 menuconfig如何实现界面,会读取各个目录下的Kconfig来决定如何显示

二、设备树编译:

1、创建fs4412的设备树文件 路径 cp arch/arm/boot/dts/exynos4412-origen.dts arch/arm/boot/dts/exynos4412-fs4412.dts 2、修改Makfile编译自己的设备树: vim arch/arm/boot/dts/Makefile 加入:exynos4412-fs4412.dtb \ 3、设备树文件修改: vim arch/arm/boot/dts/exynos4412-fs4412.dts 4、编译设备树 make dtbs ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- 5、修改内核文件drivers/clk/clk.c 修改 static bool clk_ignore_unused; 为 static bool clk_ignore_unused = true;

三、配置内核:

cp arch/arm/configs/exynos_defconfig .config 需要先编译设备树 make menuconfig ARCH=arm make menuconfig ARCH=arm 修改内核 make uImage ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- 编译内核 make dtbs ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi- 编译设备树

四、设备树讲解

#include "exynos4412.dtsi" //设备树头文件 有很多的设备树头文件 例如: srom-cs1@5000000 { //bank1 物理设备 描述 CS0为40000000 compatible = "simple-bus"; //对象的名字 #address-cells = <1>; //该对象/设备使用到的 寄存器 #size-cells = <1>; reg = <0x5000000 0x1000000>; ranges; ethernet@5000000 { compatible = "davicom,dm9000"; reg = <0x5000000 0x2 0x5000004 0x2>; interrupt-parent = <&gpx0>; //描述该硬件使用的是哪一个中断控制器上的中断 描述了该对象/硬件 使用到的中断信息 interrupts = <6 4>; //描述 该中断控制器上的 具体哪一个中断 davicom,no-eeprom; mac-address = [00 0a 2d a6 55 a2]; //status = "okay"/"disable" ; 表示 启动 / (根目录) }; };
最新回复(0)