mini2410
by panasonic.lin@163.com
最近在淘宝上淘了一块友善的SBC2410X的板子,感谢MID大哥这么慷慨热心,让我可以play arm9 with linux,
起码不是在虚拟机qemu里面兜两圈拉。
虽然板子里面友善已经移植好了uboot1.1以及vivi,但是赫赫,还是自己动手实践一下才能学习到东西。
移植都大同小异拉,最新的uboot200911已经包含了sbc2410x这块板子了,所以步骤比较简单,我也是在
?移植u-boot-2009-11->S3c44b0公板的时候学到不少东西。
1.修改Makefile
CROSS_COMPILE =arm-none-eabi-
2.make clean;make sbc2410x_config;
3.在make之前,我这块板子上的norflash不是标配的am29lv800db,而是am29lv160db,容量大一倍,
友善自带的光盘上的jtag烧写软件sjf2410烧写不了am29lv160db,h-jtag可以直接烧写。看来只能改拉,不改动可以用,但是
问题会很多。
首先是include/configs目录下的sbc2410x.h配置文件, 附件是补丁patch,更改了nfs以及flash,注意这里的串口1很容易唬人。
https://static.assets-stash.eet-china.com/album/old-resources/2010/4/15/9b82b5c3-aadb-4ffc-9e55-76a14f14fb26.rar
其次是board/sbc2410x目录下的flash.c文件,附件是补丁,还是那句老话,这个需要看flash的datasheet,看看扇区分布以及
擦写命令集。
https://static.assets-stash.eet-china.com/album/old-resources/2010/4/15/aa0ae241-8581-444e-af7a-94f2d715269a.rar
4.make后直接用h-jtag烧写到板子上,然后把跳线跳到nor启动。
有关uboot从nand启动的很多文章都有介绍,我就不写了,等我nor启动系统正常后,回去偷偷弄来玩下。
uboot启动后可以用uboot的命令检验一下,最重要的是flinfo。
好了,下面弄内核,最新的linux2.6.30已经包含了2410的平台,可以进入/arch/arm/configs看看常用的配置。
也可以输入make help看看合适的平台。
panasonic@linux-tricy:~/Data/linux-2.6.30> make help
Cleaning targets:
clean - Remove most generated files but keep the config and
enough build support to build external modules
mrproper - Remove all generated files + config + various backup files
distclean - mrproper + remove editor backup and patch files
rpc_defconfig - Build for rpc
rx51_defconfig - Build for rx51
s3c2410_defconfig - Build for s3c2410
s3c6400_defconfig - Build for s3c6400
sam9_l9260_defconfig - Build for sam9_l9260
修改make file的交叉编译器后,直接用2410默认配置,然后make menuconfig或者make xconfig或者make gconfig配置。
配置的时候注意选用EABI编译内核,也选上nfs的支持,其他看着办。
> make s3c2410_defconfig
> make zImage之后生成压缩的映像,如果需要uboot boottm命令启动的话还需要生成uImage,其实直接用make uImage也行,需要配置
压缩的text,bss地址,菜单上有。我直接用下面命令生成了。
> mkimage -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -n Linux2.6.30 -d ./zImage uImage
启动uboot,下载映像到内存。
[Panasonic@163.com ]# tftp 30008000 uImage
Using CS8900-0 device
TFTP from server 192.168.0.1; our IP address is 192.168.0.2
Filename 'uImage'.
Load address: 0x30008000
Loading: #################################################################
#################################################################
#
done
Bytes transferred = 1919060 (1d4854 hex)
验证一下映像头。
[Panasonic@163.com ]# iminfo
## Checking Image at 30008000 ...
Legacy image found
Image Name: Linux2.6.30
Created: 2010-04-13 5:53:57 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1918996 Bytes = 1.8 MB
Load Address: 30008000
Entry Point: 30008040
Verifying Checksum ... OK
好了,可以启动内核拉!
结果内核找不到网卡,估计没有cs8900a的驱动。
1 .在/arch/arm/plat-s3c24xx/include/plat/common-smdk.h文件中添加映射信息其中使用宏__phys_to_pfn 即将物理地址右移12位
#define pSMDK2410_ETH_IO __phys_to_pfn(0x19000000)
#define vSMDK2410_ETH_IO S3C2410_ADDR(0x04000000)
#define SMDK2410_ETH_IRQ IRQ_EINT9
***********************************************************************************
2.arch/arm/mach-s3c2410/mach-smdk2410.c 添加地址映射
static struct map_desc smdk2410_iodesc[] __initdata={
+ {vSMDK2410_ETH_IO, pSMDK2410_ETH_IO, SZ_1M, MT_DEVICE} //添加
};
***********************************************************************************
3.修改 drivers/net/cs89x0.c,diff补丁见附件。
https://static.assets-stash.eet-china.com/album/old-resources/2010/4/15/8a607bba-07db-4b79-9f25-6b26fc7a73f3.rar
4.重新make menuconfig的时候在设备驱动/网络设备里可能要打开NET_PCI或者NET_ISA的选项才会有cs89x0的选项。
重新make uImage。
下面开始弄根文件系统,建立空文件夹或者建立etc配置文件或者脚本参见google,重点是busybox.
这里用的是busybox1.15.2,编译它和内核都是用gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72)
编译busybox选择静态编译,make install到当前目录的_install目录,其他默认,最后cp -a到nfs根文件系统目录下。
出乎意料的是,不管我怎么弄,都出现了kill init的内核panic。但是友善自带的根文件系统没问题,问题一定是出在编译器。
Sourcery G++自带的PDF文档里面getting start有很重要的一点就是,默认编译出来的代码是armv5的!除非你传递参数给gcc指定
编译出armv4t的代码,传递的参数是-march=armv4t!s3c2410/s3c2440的core是arm920t应该是armv4t的架构。
从读取的elf头来看确实有点差异
3.2.2. Compiling for ARMv4t systems
By default Sourcery G++ generates Linux binaries that require an ARMv5 or later CPU. To build
applications or libraries capable of running on ARMv4t CPUs, use the -march=armv4t command-
line option.
Runtime libraries suitable for ARMv4t systems are supplied in the armv4t subdirectory.
Code compiled for ARMv4t is ABI compatible with ARMv5 code. Code and binaries compiled for
different architectures may be mixed freely.
Caution
There are several other ways to tell the compiler to generate ARMv4t code. However
-march=armv4t must be used when linking to ensure the correct libraries and startup
code are selected.
在编译busybox的时候添加指定的CFLAGS=-march=armv4t,根文件系统总算完成拉。
下面弄个最简单的hello测试一下:
#include<stdio.h>
int main(void)
{
printf("Hello World!\n");
return 1;
}
panasonic@linux-tricy:~/app> arm-none-linux-gnueabi-gcc -o hello -static hello.c
没加-march=armv4t运行,结果是非法指令!
panasonic@linux-tricy:~/app> arm-none-linux-gnueabi-gcc -march=armv4t -o hello -static hello.c
加了-march=armv4t后运行正常。
为了方便以后编译程序模块,要想个法子才行,友善的做法很好,就是建立带参数的脚本代替gcc,脚本是另外一个名字,叫arm-linux-gcc!脚本内容如下
#!/bin/bash
exec arm-none-linux-gnueabi-gcc -march=armv4t $*
g++也类似。其他工具ar阿ld阿统统建立符号链接。最后加入搜索路径方便使用。
gedit ~/.bashrc
source ~/.bashrc
好了,mini2410就到这里拉。
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
用户156547 2010-10-9 16:27
用户1620250 2010-4-18 09:24
tengjingshu_112148725 2010-4-16 01:09