先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题
再次介绍一下,本系列文章的主要目的是记录下在学习《韦东山嵌入式教学视频》的课程笔记,掌握一门新的技术要从会使用和操作它开始,本系列没有深入去分析uboot的框架以及源码,后期想再开一个博客,仔细分析uboot的框架和源码
- 裁剪,默认的uboot包含的功能太多,但是我们又不需要,可以注释掉下面的宏定义,仍然在smdk2440.h中
//#define CONFIG_USB_OHCI
//#define CONFIG_USB_KEYBOARD
//#define CONFIG_USB_STORAGE
//#define CONFIG_DOS_PARTITION
//#define CONFIG_CMD_DATE
//#define CONFIG_CMD_DHCP
#if 0
#define CONFIG_CMD_FAT
#define CONFIG_CMD_EXT2
#define CONFIG_CMD_UBI
#define CONFIG_CMD_UBIFS
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#define CONFIG_MTD_PARTITIONS
#define CONFIG_YAFFS2
#define CONFIG_RBTREE
#endif
- uboot启动的时候,会读取一些环境变量,包括本机ip地址,server ip地址
内核打印出来的分区信息,那么我们该如何初始化设置呢
在smdk2440.h中定义
#define CONFIG_BOOTARGS "console=ttySAC0 root=/dev/mtdblock3"
#define CONFIG_BOOTCOMMAND "nand read 30000000 kernel;bootm 30000000"
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.0.17
#define CONFIG_SERVERIP 192.168.0.106
#define CONFIG_ETHADDR 00:0c:29:4d:64:f6
- 上面的环境变量保存在哪里呢?这个需要根据我们的实际规划以及硬件分配来决定,比如在韦老师的jz2440板子上,我们可以保存在板子上的nand flash中,定义宏如下
#if 0 /* 以下定义是将环境变量保存在nor中 */
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x070000)
#define CONFIG_ENV_IS_IN_FLASH
#define CONFIG_ENV_SIZE 0x10000
/* allow to overwrite serial and ethaddr */
#define CONFIG_ENV_OVERWRITE
#else /* 以下定义是将环境变量保存在nand中 */
#define CONFIG_ENV_IS_IN_NAND
#define CONFIG_ENV_OFFSET 0x40000
#define CONFIG_ENV_SIZE 0x20000
#define CONFIG_ENV_RANGE CONFIG_ENV_SIZE
#endif
- 编译并烧写到板子
tftp 30000000 u-boot.bin
protect off all
erase 0 3ffff
cp.b 30000000 0 40000
reset
- 重启之后,发现还是有警告打印,这是因为环境变量没有保存到nand中,输入如下命令
save
- 支持mtdparts命令,在smdk2440.h中定义如下
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#define MTDIDS_DEFAULT "nand0=jz2440-0" /* 哪一个设备 */
#define MTDPARTS_DEFAULT "mtdparts=jz2440-0:256k(u-boot)," \
"128k(params)," \
"2m(kernel)," \
"-(rootfs)" \
- 在board.c/board_init_r函数中,增加如下语句
run_command("mtdparts default", 0);
- 烧写文件系统,烧写jffs2文件系统
tftp 30000000 fs_mini_mdev.jffs2
nand erase.part rootfs
nand write.jffs2 30000000 0x00260000 5b89a8
set bootargs console=ttySAC0 root=/dev/mtdblock3 rootfstype=jffs2
boot
- 制作补丁
因为uboot的源码,我们可以在网上下载到,但是我们如何将这个uboot移植到我们的板子上使用呢,我们可以发布patch的方式,按照如下步骤:
a. 完成功能调试之后,在当前目录下执行 make distclean
b. 删除多余文件 rm -rf u-boot.dis
c. 切换到上一级目录,cd ..
d. 修改文件夹名称 mv u-boot-2012.04.01 u-boot-2012.04.01_100ask
e. 解压以前的压缩包 tar xjf u-boot-2012.04.01.tar.bz2
f. 对比两个文件夹,并生成补丁
diff -urN u-boot-2012.04.01 u-boot-2012.04.01_100ask > u-boot-2012.04.01_100ask_zj.patch
- 制作好的补丁patch应该怎么使用呢
a. 解压uboot源码tar xjf u-boot-1.1.6.tar.bz2
b. 切换到解压好的路劲下
c. 打补丁patch -p1 < ../ u-boot-1.1.6_jz2440.patch