一. 什么叫移植
shell 框架 ----> x6818 (s5p6818) ----> mmmm (s5p6818) 根据硬件平台的差异,将代码进行少量的修改 就能使得该代码在目标平台上正常运行起来,该过程称作移植
二. 移植内容:
2.1 移植uboot uboot 属于bootloader 的一种 它是硬件上电执行的第一个代码 类似于PC机上的BIOS 它负责为操作系统启动初始化硬件 负责加载操作系统 启动操作系统 2.2 移植linux内核 linux内核的核心功能: 1) 进程的管理 2) 进行间通信 3) 虚拟文件子系统 4) 内存管理 5) 网络子系统 谈谈板子上不上操作系统的优劣: 优点: 可以更容易的实现更加复杂的业务逻辑 缺点: 硬件成本高. 2.3 制作根文件系统 1号进程对应的程序 ls rm touch cd ... 通过移植busybox 实现以上命令
三. 目标
1 ) 熟悉uboot 源码 掌握编译方式 2 ) 熟悉linux内核框架结构 掌握内核的裁剪配置方式 掌握内核的编译过程 3 ) 掌握根文件系统镜像的制作方式
四. 开发板的烧写实验
4.0 擦除emmc 并分区
mmc erase 0 100000 fdisk 2 3 0x100000:0x4000000 0x4100000:0x2f200000 0x33300000:0 注: 2 ---> 第二个设备 3 ---> 分区个数 剩余: 各分区的起始地址 + 分区长度 4.1 烧写uboot cp /mnt/hgfs/porting/env/uboot.bin /tftpboot tftp 48000000 uboot.bin update_mmc 2 2ndboot 48000000 200 下载的字节数(上面提示多少就是多少555f0) 烧写完成后重启开发板 重新设置ip setenv ipaddr 192.168.1.6 saveenv setenv serverip 192.168.1.8 saveenv 4.2 烧写linux内核 cp /mnt/hgfs/proting/env/uImage /tftpboot/ tftp 48000000 uImage mmc write 0x48000000 0x800 0x3000 0x800: 要写入的偏移位置 单位扇区 0x3000: 要连续写入的扇区个数 > 下载的字节个数 / 512 重启之后报错: ERROR: can't get kernel image! setenv bootcmd mmc read 48000000 800 3000 ; bootm 48000000 saveenv mmc read 48000000 800 3000: 从emmc 偏移0x800扇区位置开始连续读取 0x3000个扇区内容到内存0x48000000开始的位置 bootm 48000000 启动操作系统 重启开发板: Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) 原因是没有挂载根文件系统 4.3 烧写根文件系统镜像 rootfs_ext4.img cp /mnt/hgfs/proting/env/rootfs_ext4.img /tftpboot/ tftp 48000000 rootfs_ext4.img mmc write 0x48000000 20800 32000 setenv bootargs root=/dev/mmcblk0p2 rootfstype=etx4 console=ttySAC0 maxcpus=1 lcd=wy070ml tp=gslx680 注: root=/dev/mmcblk0p2,指定根文件系统所在的分区 rootfstype,文件系统的类型 console,控制台 ttySAC0, uart0控制器 maxcpus=1,只启动cpu0 lcd, LCD屏的类型 tp,触摸屏的类型 也支持加载网络根文件系统: setenv bootargs root=/dev/nfs nfsroot=serverip:路径 ... saveenv 重启开发板 用户名: root 密码: 123456
五 编写UC程序在开发板上执行
上位机: mkdir porting cd porting vim helloworld.c arm-coretex_a9-linux-gnueabi-gcc helloworld.c cp a.out /tftpboot 下位机: tftp -g -r a.out 192.168.1.8 -g: Get File -r: FILE Remote file 发现下载不下来 在内核下配置IP地址: ifconfig eth0 192.168.1.6 ping 192.168.1.8 再次执行 tftp -g -r a.out 192.168.1.8 发现执行不了, ls a.out -l chmod +x a.out ./a.out
1.Uboot 的基本概念
通用的bootloader bootloader 的作用就是初始化硬件 加载启动操作系统 bootloader 不属于操作系统内核,这一部分不具有可移植性. 通用的含义: 1) 支持多种cpu架构: powerpc arm x86 ... 2) 可以加载启动多种操作系统: linux vxworks (实时性非常强) QNX (实时操作系统) ... 怎么理解实时性: 对于linux来说,有点吃大锅饭的意思,所有的进程都有得到执行的机会 vxworks 是丛林法则,高优先级的任务不执行完,低优先级的没有机会执行.
2.Uboot 源码的获取
1) U-Boot 官网: http://www.denx.de/wiki/U-Boot/SourceCode U-Boot 源码的获取: https://source.denx.de/u-boot/u-boot# (墙裂不推荐) 2) 去拿demo 板中的uboot源码 uboot.tar.bz2 3) 编译uboot源码 cd porting cp /mnt/hgfs/proting/env/uboot.tar.bz2 /tftpboot/ tar xf uboot.tar.bz2 cd uboot make x6818_config @选出和具体的芯片相关的代码 选出和x6818 硬件相关的代码, 参与后续编译 make 验证自行编译生成的ubootpak.bin 是否有效 4) 阅读uboot源码: 从README开始 find ./ type f | wc ---> 发现有4002个文件 开源程序: 1) 编译时如果有警告,忽略 2 ) 从README / INSTALL 入手 uboot 代码结构 (s5p6818相关的):



