本篇博客记录将uboot,kernel,rootfs及QT4.8+openCV移植到x210v3s开发板全过程,持续更新中.......
博主信息
中文名:疯仔
英文名:Swann Kang
坐标:天津(Tianjing)
时间:2017/12/03(大三)
Email:[email protected]
交流QQ:1159943540
淘宝店铺:疯仔嵌入式物联网科技
目标开发板: x210v3s
CPU: SAMSUNG S5PV210
资源: 512MB DDR2,4GB inand,DM9000,IIC显示屏等
UBOOT版本:1.3.4 android_uboot_smdkv210.tar.bz2
Kernel: 2.6.35.7
busybox:1.23
QT:4.8.5
开发环境:vmware12.0 + 64位 Ubuntu16.04 虚拟机
参考开发板:三星SMDKV210
开发环境搭建:
1.安装交叉编译工具链:arm-none-linux-2009q3
2.安装ssh服务器
3.
开始移植:
解压uboot源码
tar -jxvf android_uboot_smdkv210.tar.bz2
主makefile分析
TEXT_BASE 是将来我们整个 uboot 链接时指定的链接地址。因为 uboot 中启
用了虚拟地址映射,因此这个 C3E00000 地址就等于 0x23E00000(也可能是
33E00000具体地址要取决于 uboot中做的虚拟地址映射关系)。
回顾裸机中讲的链接地址的问题,再想想 dnw 方式先下载x210_usb.bin 然后
再下载uboot.bin 时为什么第二个地址是 23E00000.
查看原理图
x210v3s在DRAM0和DRAM1的位置各接了256MB的DDR2内存
配置编译:
make smdkv210single_config
make -j4
烧录运行:
檫除原uboot
安卓:busybox dd if=/dev/zero of=/dev/block/mmcblk0 bs=512 seek=1 count=1 conv=sync
sync
LINUX:busybox dd if=/dev/zero of=/dev/mmcblk0 bs=512 seek=1 count=1 conv=sync
sync
烧录uboot至sd卡
fdisk -l查看sd设备
启动:
错误分析:
1.未打印“OK“字样,说明在这之前已出错
uboot源码分析
找到uboot入口函数
u-boot.lds 中找到 start.S入口
(1)在 C 语言中整个项目的入口就是 main 函数(这是 C 语言规定的),所以譬如
说一个有10000 个.c 文件的项目,第一个要分析的文件就是包含了 main 函数的
那个文件。
(2)在 uboot 中因为有汇编阶段参与,因此不能直接找 main.c。整个程序的入口
取决于链接脚本中ENTRY 声明的地方。ENTRY(_start)因此_start符号所在的文
件就是整个程序的起始文件,_start所在处的代码就是整个程序的起始代码。
找到start.s
start.s解析
lowlevel_init.s解析
在uart_asm_init函数中打印‘o'
在这里打印’k'
经调试发现三星smdkv210开发板有PMIC的IIC电源管理,在这里没有,把118行 bl PMIC_InitIp注释,再重新编译运行
可以看到uboot已经启动,但启动内核失败
print打印环境变量,发现环境变量错误,bdinfo查看详细
重新设置环境变量
set bootcmd 'movi read kernel 30008000; movi read rootfs 30B00000 300000; bootm 30008000 30B00000'
set bootargs console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3
SMDKV210 # set ipaddr 10.5.74.20
SMDKV210 # set serverip 10.5.74.81
SMDKV210 # set gatewayip 10.5.74.1
save
重新启动,发现环境变量无法保存,mmc驱动无法工作
SD/MMC: unrecognised EXT_CSD structure version 7
unrecognised EXT_CSD structure version 7
Card init fail!
0 MB
从启动信息中发现关键信息,开发板inand版本高,uboot无法识别,把信息复制到source insight中搜索,定位问题
在/u-boot-samsung-dev/drivers/mmc/mmc.c中
把相应代码修改,这里直接注释err = -1和goto out 等
重新编译烧录
此时inand版本号的问题已解决,发现内核启动失,查看环境变量
使用命令md和mw进行内存读写测试
读写正常,说明DDR初始化成功,并且正常工作,但是不难看出,大小错了
x210v3s开发板中,实际在bank0上接了256MBDDR,地址为0x20000000到0x2fffffff,bank1中接了256MB内存,地址为0x40000000到0x4fffffff
修改代码
在include/configs/中的smdkv210single.h中
修改后make clean 再重新编译烧录
内存配置修改成功,尝试ping命令,发现网卡地址配置错了
在smdkv210single.h中修改配置
查看原理图
可知本发板的dm9000接在SROM BANK1上,起始地址为88000000,在头文件中修该配置如下
同时还有smdkc110.c中dm9000_pre_init函数
重新编译烧录运行
可以看到已经ping通,网卡正常工作
至此uboot已初步移植成功,接下来我们在uboot中修改Makefile等添加自己定义的开发板,
然后复制smdkc110文件夹为swann210文件夹
同时在include/configs/中复制smdkv210single.h为swann210.h
同时修改swann210文件夹下的u-boot.lds链接脚本
重新编译
接下来我们为开发板的uboot添加开机logo