湖水连天天连水,秋来分外澄清
分类: IT职场
2016-11-14 16:19:13
一、初步修改
国内嵌入式厂商研发的S5PV210开发板大都基于SMDKV210评估板做了裁剪和调整,所以三星提供的u-boot、内核、文件系统大都适用于这些S5PV210开发板,我们就将三星提供的android_uboot_smdkv210.tar.bz2代码包移植到SMART210开发板。
1. 下载三星公司提供的android_uboot_smdkv210.tar.bz2源代码包,然后解压:
tar jxvf android_uboot_smdkv210.tar.bz2
进入目录:
cd u-boot-samsung-dev
2. 安装交叉编译器:
gedit Makefile
在147行,我们发现u-boot使用arm-2009q3编译器:
ifeq ($(ARCH),arm)
#CROSS_COMPILE = arm-linux-
#CROSS_COMPILE = /usr/local/arm/4.4.1-eabi-cortex-a8/usr/bin/arm-linux-
#CROSS_COMPILE = /usr/local/arm/4.2.2-eabi/usr/bin/arm-linux-
CROSS_COMPILE = /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
endif
在2.1.3节我们已经安装好了arm-2009q3编译器:
3. 修改配置文件,原文件设定调试信息通过串口3输出,改为串口0输出:
vim include/configs/smdkv210single.h
将:
#define CONFIG_SERIAL3 1 /* we use UART3 on SMDKC110 */
修改为:
#define CONFIG_SERIAL1 1 /* we use UART1 on SMDKC110 */
4. 配置Uboot:
make smdkv210single_config
5. 编译:
make
编译完毕后可以得到u-boot.bin。接下来将生成的u-boot.bin烧写到SD卡中,首先准备一张不小于2GB的SD卡,并插到在VMware中装有Linux操作系统的PC机上。在识别SD读卡器的时候,有可能遇到被windows识别出来,而Linux看不到的情况。这时在VMware的菜单栏上依次点VMàRemovable DevicesàUSB Devicesà(你的SD卡)(USB2.0 Device),选择connect选项。
图3-2 识别SD卡示意图1
此时,可以看到Windows系统右下角弹出安全退出USB设备的消息提示,说明U盘已被虚拟系统识别,在VMware的右下角会看到一个USB的图标。
图3-3 识别SD卡示意图2
通过#fdisk -l命令确认虚拟机中Linux系统是否识别U盘,如下图,笔者2G的SD卡已经被识别,设备文件名称为/dev/sdb。
图3-4 识别SD卡示意图3
在烧写U-boot.Bin之前,需要对SD卡进行格式化。在Linux的终端窗口,使用fdisk /dev/sdb命令删除原来所有分区,sdb为系统为SD卡分配的设备节点。注意,具体由节点名称而定,有可能是sdc,sde等。使用如下指令查询设备节点: cat /proc/partitions 示例如下:
图3-5 查看磁盘分区
sdb节点即为用户插入的SD卡,然后在终端下键入fdisk /dev/sdb命令
图3-6 进行磁盘分区
接下来的参数中选择d和w,输入d,表示删除分区,输入w表示保存已经修改的分区信息。至此,原/dev/sdb被删除。拨掉SD卡,再插入PC机上,注意必须拨掉后再插入,否则仍然会提示存在/dev/sdb节点,会造成出错。然后就可以使用uboot源代码提供的sd_fusing.sh脚本文件进行烧写。
在android_uboot_smdkv210.tar.bz2解压后的源代码包下,有sd_fusing文件夹,里面提供了诸多烧写SD卡的脚本,这里采用sd_fusing.sh脚本,该脚本内容如下:
#
# Copyright (C) 2010 Samsung Electronics Co., Ltd.
#
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
####################################
reader_type1="/dev/sdb"
reader_type2="/dev/mmcblk0"
if [ -z $1 ]
then
echo "usage: ./sd_fusing.sh
exit 0
fi
if [ $1 = $reader_type1 ]
then
partition1="$11"
partition2="$12"
partition3="$13"
partition4="$14"
elif [ $1 = $reader_type2 ]
then
partition1="$1p1"
partition2="$1p2"
partition3="$1p3"
partition4="$1p4"
else
echo "Unsupported SD reader"
exit 0
fi
if [ -b $1 ]
then
echo "$1 reader is identified."
else
echo "$1 is NOT identified."
exit 0
fi
####################################
# make partition
echo "make sd card partition"
echo "./sd_fdisk $1"
./sd_fdisk $1
dd iflag=dsync oflag=dsync if=sd_mbr.dat of=$1
rm sd_mbr.dat
####################################
# format
umount $partition1 2> /dev/null
umount $partition2 2> /dev/null
umount $partition3 2> /dev/null
umount $partition4 2> /dev/null
echo "mkfs.vfat -F 32 $partition1"
mkfs.vfat -F 32 $partition1
#echo "mkfs.ext2 $partition2"
#mkfs.ext2 $partition2
#echo "mkfs.ext2 $partition3"
#mkfs.ext2 $partition3
#echo "mkfs.ext2 $partition4"
#mkfs.ext2 $partition4
####################################
# mount
#umount /media/sd 2> /dev/null
#mkdir -p /media/sd
#echo "mount -t vfat $partition1 /media/sd"
#mount -t vfat $partition1 /media/sd
####################################
#
bl1_position=1
uboot_position=49
echo "BL1 fusing"
./mkbl1 ../u-boot.bin SD-bl1-8k.bin 8192
dd iflag=dsync oflag=dsync if=SD-bl1-8k.bin of=$1 seek=$bl1_position
rm SD-bl1-8k.bin
####################################
#
echo "u-boot fusing"
dd iflag=dsync oflag=dsync if=../u-boot.bin of=$1 seek=$uboot_position
####################################
#
echo "U-boot image is fused successfully."
echo "Eject SD card and insert it again."
烧写到SD卡时,了解一下SD卡的分区,下面是有关SD卡分区的图,它的分区情况:
图3-7 SD卡分区示意图
在这里可以看到,SD卡一块的大小为512B,第一块为保留块,紧接着的8K存放BL1,所以BL1烧写的起始块标号为1,这也就是第二条烧写命令中seek=1的来源了;接下来存放环境变量,有的资料中将环境变量与BL1文件总称为BL1文件,不过这是的BL1文件就不再是8K大小了,而是加上环境变量的大小共24K了,也就是48块;之后存放BL2文件,也就是uboot.bin,起始块标号49。最后的部分是我们自己的其他使用拷贝空间了。
通过阅读脚本内容,了解到该脚本会探测Linux系统下dev文件夹下的设备文件,并进行格式化,然后将编译生成的Uboot.bin前8K的内容,通过mkbl1可执行文件提取出来,烧写到存储介质的bl1_position位置,即第一个扇区,然后将剩余完整的Uboot烧写到uboot_position位置,即第49个扇区开始的位置。
值得注意的是:不同用户将SD卡读卡器插入USB口后,在dev文件夹下,SD卡的设备文件名可能有所不同,这时需根据自己的情况修改reader_type1="/dev/sdb"文件内容。dd命令是linux下非常有用的一个命令,作用就是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
通过sd_fusing.sh脚本烧写SD卡成功后,即可将SD卡插入开发板的SD卡插槽,将启动设置按键扳至SD卡启动一侧。同时开启Putty调试终端,显示内容如下:
OK
U-Boot 1.3.4 (Dec 25 2013 - 10:07:18): for E&E210
CPU: S5PV210@1000MHz(OK)
APLL = 1000MHz, HclkMsys = 200MHz, PclkMsys = 100MHz
MPLL = 667MHz, EPLL = 80MHz
HclkDsys = 166MHz, PclkDsys = 83MHz
HclkPsys = 133MHz, PclkPsys = 66MHz
SCLKA2M = 200MHz
Serial = CLKUART
Board: SMDKV210
DRAM: 256 MB
SD/MMC: 1946MB
NAND: 512 MB
In: serial
Out: serial
Err: serial
checking mode for fastboot ...
Hit any key to stop autoboot: 0
SMDKV210 #
初次编译后可以成功运行,S5PV210运行在1GHz,但认出来的内存大小等信息有误。需要进一步进行修改。