工作上玩过了全志A20,瑞芯微RK3288后,愈发觉得这些芯片很多地方玩不转,原因很简单因为对硬件不够熟悉,加上安卓框架过于庞大。
为了弥补这个缺陷,加上2440在网上资料比较多,更容易快速系统的学习。所有有了这个开篇,当然在接下去的一段时间内,玩的都会是uboot.
那么首先先搭建一个开发环境,这里买了韦东山开发的jz2440,主要是还是因为资料给的比较多吧,看到后面还有卖一些视频的。 经过两个平台的开发,也知道了资料是最宝贵的,一头扎进代码里并没有什么卵用,只能靠运气。
用作者给的虚拟机感觉太low了,这里就用ubuntu15.10吧。
虚拟机一开始用vmware workstation12 结果共享这个功能使用用不了,wmtools这玩意一开始搞了半天装上了也不行,也不想搞别的服务这样折腾了。
干脆放弃这个虚拟机,用之前一直很熟的VirtualBox,果不其然,一遍就搞定了。
我的环境是win10,VirtualBox下装ubuntu15.10. 安卓虚拟机的教程可能太LOW了,网上一堆的,就不放上了丢人现眼了。
这里就讲一下ubuntu 打开 root用户, 输入命令
sudo passwd root
输入两次密码就ok了
接下来直接把交叉编译工具装上来,中间有需要的工具就直接装上就好了。
交叉编译器就直接用提供的 arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 不折腾了。
这里中间插入一下vbox的共享目录非常不爽,只有root才能操作,我们改一下权限,这样用起来也方便一点。
virtualBox的共享目录是在/mnt 下,其他用户没有任何权限,
解决方法是把你自己加入到vboxsf组里面,这样不用每次开机改权限那么麻烦了。
这里的共享目录命名规则是 sf_加上你的共享文件夹的名字,这里共享文件夹可以弄很多个,非常方便。不像smb那么麻烦,访问也不是很方便。
drwxrwx--- 1 root vboxsf 0 4月 4 12:40 sf_shared/
sudo usermod -a -G vboxsf yourusernanme
我的用户的命令就是
sudo usermod -a -G vboxsf u
重启一下就可以了。
开始安装交叉编译器,其实也就是解压一下,然后配置一下环境变量罢了。
先弄一个工作目录,我放到 ~/jz2440 下,也就是/home/u/jz2440/
cd /media/sf_shared
tar -xvf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 -C /home/u/jz2440/
接下来配置环境变量,我们只在我们当前这个用户增加这个配置
vim ~/.bashrc
最后加入一行
PATH=$PATH:~/jz2440/gcc-3.4.5-glibc-2.3.6/bin/
保存退出, 重新导入环境变量即可。
source ~/.bashrc
然后来验证一下是否正常
u@111:~$ arm-linux-gcc -v
bash: /home/u/jz2440/gcc-3.4.5-glibc-2.3.6/bin/arm-linux-gcc: 没有那个文件或目录
这里发现arm-linux-gcc 路径是每次,可是他提示没有那个文件或目录,我猜测他引用了某些东西
解决办法,因为我的ubuntu是64位的没有安装32位的库
sudo apt-get install libc6:i386
u@111:/$ arm-linux-gcc -v
Reading specs from /home/u/jz2440/gcc-3.4.5-glibc-2.3.6/bin/../lib/gcc/arm-linux/3.4.5/specs
Configured with: /work/tools/create_crosstools/crosstool-0.43/build/arm-linux/gcc-3.4.5-glibc-2.3.6/gcc-3.4.5/configure --target=arm-linux --host=i686-host_pc-linux-gnu --prefix=/work/tools/gcc-3.4.5-glibc-2.3.6 --with-float=soft --with-headers=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/include --with-local-prefix=/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux --disable-nls --enable-threads=posix --enable-symvers=gnu --enable-__cxa_atexit --enable-languages=c,c++ --enable-shared --enable-c99 --enable-long-long
Thread model: posix
gcc version 3.4.5
下面编译uboot
看一下接下来用的工具的目录
u@111:~/jz2440$ tree -L 2
.
├── gcc-3.4.5-glibc-2.3.6
├── linux
│ ├── linux-2.6.22.6_jz2440.patch
│ └── linux-2.6.22.6.tar.bz2
└── uboot
├── u-boot-1.1.6_jz2440.patch
└── u-boot-1.1.6.tar.bz2
u@111:~/jz2440/uboot$ ls
u-boot-1.1.6 u-boot-1.1.6_jz2440.patch u-boot-1.1.6.tar.bz2
tar -xvf u-boot-1.1.6.tar.bz2
cd u-boot-1.1.6/
patch -p1 < ../u-boot-1.1.6_jz2440.patch
make 100ask24x0_config
make
这样就得到了uboot.bin
u@111:~/jz2440/uboot/u-boot-1.1.6$ ll u-boot.bin
-rwxrwxr-x 1 u u 198316 4月 4 13:42 u-boot.bin*
再接编译内核
tar -xvf linux-2.6.22.6.tar.bz
cd linux-2.6.22.6/
patch -p1 < ../linux-2.6.22.6_jz2440.patch
cp config_ok .config
make uImage 【这里用多线程并发编译可以加快速度 参数 -jN 我使用8】
又一次出现了幺蛾子:
Makefile:1449: *** mixed implicit and normal rules: deprecated syntax
/home/u/jz2440/linux/linux-2.6.22.6/Makefile:416: *** mixed implicit and normal rules: deprecated syntax
/home/u/jz2440/linux/linux-2.6.22.6/Makefile:1449: *** mixed implicit and normal rules: deprecated syntax
make[1]: *** No rule to make target 'silentoldconfig'。 停止。
CHK include/linux/version.h
UPD include/linux/version.h
make: *** No rule to make target 'include/config/auto.conf', needed by 'include/asm-arm/.arch'。 停止。
解决办法:
由于我的系统的make工具太新,make的旧版规则已经无法兼容新版。
修改前:416行 config %config: scripts_basic outputmakefile FORCE
修改后:416 行 %config: scripts_basic outputmakefile FORCE
修改前:1449 行 / %/: prepare scripts FORCE
修改后:1449 行 %/: prepare scripts FORCE
重新来一次,发现可以了
make -j8 uImage
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
AS arch/arm/boot/compressed/head.o
GZIP arch/arm/boot/compressed/piggy.gz
CC arch/arm/boot/compressed/misc.o
AS arch/arm/boot/compressed/piggy.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
UIMAGE arch/arm/boot/uImage
"mkimage" command not found - U-Boot images will not be built
Image arch/arm/boot/uImage is ready
这里似乎又出现了一个问题,找不到u-boot,看提示就看出来打包uImage失败了。
发现这个目录下: ~/jz2440/linux/linux-2.6.22.6/arch/arm/boot
只有Image 和zImage 没有uImage
猜测一下原来uImage 应该就是带uboot的镜像把,那么我们看看这个目录下有什么文件:
drwxrwxr-x 4 u u 4096 4月 4 14:11 ./
drwxrwxr-x 52 u u 4096 8月 31 2007 ../
drwxrwxr-x 2 u u 4096 8月 31 2007 bootp/
drwxrwxr-x 2 u u 4096 4月 4 13:59 compressed/
-rw-rw-r-- 1 u u 40 8月 31 2007 .gitignore
-rwxrwxr-x 1 u u 3749512 4月 4 13:59 Image*
-rw-rw-r-- 1 u u 108 4月 4 13:59 .Image.cmd
-rw-rw-r-- 1 u u 1326 8月 31 2007 install.sh
-rw-rw-r-- 1 u u 2549 8月 31 2007 Makefile
-rw-rw-r-- 1 u u 220 4月 4 14:06
.uImage.cmd
-rwxrwxr-x 1 u u 1848680 4月 4 13:59 zImage*
-rw-rw-r-- 1 u u 135 4月 4 13:59 .zImage.cmd
这文件的名字似乎很像是我们关心的东西,就看看写了什么吧?
cat .uImage.cmd
cmd_arch/arm/boot/uImage := /bin/bash /home/u/jz2440/linux/linux-2.6.22.6/scripts/mkuboot.sh -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008000 -n 'Linux-2.6.22.6' -d arch/arm/boot/zImage arch/arm/boot/uImage
这里能看到一个mkuboot.sh脚本和uboot有关
#!/bin/bash
#
# Build U-Boot image when `mkimage' tool is available.
#
MKIMAGE=$(type -path "${CROSS_COMPILE}mkimage")
if [ -z "${MKIMAGE}" ]; then
MKIMAGE=$(type -path mkimage)
if [ -z "${MKIMAGE}" ]; then
# Doesn't exist
echo '"
mkimage" command not found - U-Boot images will not be built' >&2
exit 0;
fi
fi
这里看懂了就是找一个mkimage工具的路径,我在uboot目录找到了这个工具
~/jz2440/uboot/u-boot-1.1.6/tools/mkimage
感觉这样改脚本也是比较麻烦的直接用安装一下这个工具就好了
sudo apt-get install uboot-mkimage
现在没有可用的软件包 uboot-mkimage,但是它被其它的软件包引用了。
这可能意味着这个缺失的软件包可能已被废弃,
或者只能在其他发布源中找到
可是下列软件包取代了它:
u-boot-tools:i386 u-boot-tools
E: 软件包 uboot-mkimage 没有可供安装的候选者
那么就安装这两个好了:
sudo apt-get install u-boot-tools:i386 u-boot-tools
重新make
Kernel: arch/arm/boot/Image is ready
Kernel: arch/arm/boot/zImage is ready
UIMAGE arch/arm/boot/uImage
Image Name: Linux-2.6.22.6
Created: Mon Apr 4 14:27:06 2016
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1848680 Bytes = 1805.35 kB = 1.76 MB
Load Address: 30008000
Entry Point: 30008000
Image arch/arm/boot/uImage is ready
总算是可以了!!!!!
本来以为直接解压就可以完成的工作,硬是出现了好多幺蛾子,其实这些错误并没有什么,只要观察错误提示信息,加上百度和一定耐心就可以解决!
ps:看到资料中给出4.3寸屏,需要替换一个文件!
突然发现还有屏幕参数需要改对比了一下两个问题差别,多了一个480x272的配置项目,那是怎么选择的呢?以后再说吧!
/* 480x272 */
static struct s3c2410fb_mach_info smdk2440_lcd_cfg __initdata = {
static struct s3c2410fb_mach_info smdk2440_lcd_cfg_320x240 __initdata = {
原来的:
static struct s3c2410fb_mach_info smdk2440_lcd_cfg_320x240 __initdata = {
u@111:~/jz2440/linux/linux-2.6.22.6/arch/arm/mach-s3c2440$ cp /media/sf_shared/4.3寸LCD_mach-smdk2440.c mach-smdk2440.c