1. 使用openocd燒寫S3C2440的nandflash
a) 準備工作:sudo apt-get install openocdb) openocd 需要配置自己的openocd.cfg,配置文件可以放在當前執行openocd的目錄,也可以是用參數-f指定。我目前的openocd.cfg配置如下:
source [find interface/jlink.cfg]
source [find board/mini2440.cfg]
c) openocd的配置腳本目錄在/usr/share/openocd/scripts, 其中
修改了jlink.cfg的配置:adapter_khz 250
修改了mini2440.cfg的配置:
#nand device s3c2440 0
set _NANDNAME $_CHIPNAME.nand
nand device $_NANDNAME s3c2440 $_TARGETNAME
以便能夠燒寫nandflash.
d) 燒寫步驟:
1. 打開終端 openocd -f /YOUR_PATH/openocd.cfg, 提示能夠正確識別s3c2440
2. 打開另一終端: telnet localhost 4444
出現如下信息:
tgni@B460:~$ telnet localhost 4444
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
>
執行 halt
> halt
target state: halted
target halted in ARM state due to debug-request, current mode: Supervisor
cpsr: 0x20000093 pc: 0xc0731dec
MMU: enabled, D-Cache: enabled, I-Cache: enabled
>
nand probe 0
nand erase 0 0 0x60000 #大小必須是0x20000(blocksize)的整數倍
nand write 0 u-boot.bin 0
2. 利用buildroot製作交叉編譯工具鏈。
a) 使用版本buildroot-2014.02b) buildroot的編譯
make mini2440_defconfig
make menuconfig
make
生成的toolchain在output/host目錄,值得一提的是,buildroot可以編譯整個mini2440的uboot,kernel和fs。這裏我們不去嘗試了。因爲默認編譯的uboot網絡有bug,一直checksum bad...
我生成的toolchain版本是arm-linu-gcc v4.7.3.
buildroot編譯過程中遇到的錯誤都是簡單的問題,大部分是因爲系統太新,頭文件找不到或者結構定義找不到,修復一下就沒問題了。
生成的toolchain放在/opt/toolchian/目錄下,並且export PATH=/opt/toolchain/usr/bin:$PATH
如果是tcsh則使用set path = ($PATH /opt/toolchain/usr/bin)
3. uboot 編譯
已經移植好的uboot-2010.06編譯生成uboot.bin4. kernel的編譯
進入kernel目錄,cp my2440_config .config
make menuconfig
注意:我這裏選擇的是 ramfs, 所以進入
General setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
(/home/tgni/my2440/root-2.6.30.4) Initramfs source file(s)
選擇正確的rootfs目錄,其他默認即可。
編譯過程可能遇到錯誤,細心排查即可。
kernel生成zImage沒辦法使用uboot直接加載,需要通過uboot生成的mkimage工具來製作uImage。
具體命令如下:
mkimage -n 'tekkaman' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.img
mkimage 選項定義:
參數說明:
-A 指定CPU的體系結構,可用值有:alpha、arm 、x86、ia64、mips、mips64、ppc 、s390、sh、sparc 、sparc64、m68k等
-O 指定操作系統類型,可用值有:openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos
-T 指定映象類型,可用值有:standalone、kernel、ramdisk、multi、firmware、script、filesystem
-C 指定映象壓縮方式,可用值有:
none 不壓縮(一般使用這個,因爲zImage是已經被bzip2壓縮過的自解壓內核)
gzip 用gzip的壓縮方式
bzip2 用bzip2的壓縮方式
-a 指定映象在內存中的加載地址,映象下載到內存中時,要按照用mkimage製作映象時,這個參數所指定的地址值來下載
-e 指定映象運行的入口點地址,這個地址就是-a參數指定的值加上0x40(因爲前面有個mkimage添加的0x40個字節的頭)
-n 指定映象名
-d 指定製作映象的源文件
5. rootfs的注意點:
因爲rootfs的製作是我之前已經製作好的。根文件系統的製作參考blogTekkaman Ninja
http://blog.chinaunix.net/uid/20543672.html
但是一些使用mknod命令製作的文件會失效,小心看tar包的提示。
tar: Exiting with failure status due to previous errors
root-2.6.30.4/dev/null
tar: root-2.6.30.4/dev/null: Cannot mknod: Operation not permitted
root-2.6.30.4/dev/console
tar: root-2.6.30.4/dev/console: Cannot mknod: Operation not permitted
因此:進入 dev目錄:
mknod -m 600 console c 5 1;mknod -m 666 null c 1 3; (need root)
6. uboot 燒寫總結:
a) ubuntu tftpd 服務器搭建sudo apt-get install tftpd-hpa
sudo vim /etc/default/tftpd-hpa3
輸入如下:
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/tgni/tftpboot"
TFTP_ADDRESS="[::]:69"
#TFTP_OPTIONS="--secure"
TFTP_OPTIONS="-l -c -s"
sudo service tftpd-hpa start
b) 將u-boot.bin, zImage.img 放入/home/tgni/tftpboot, 這裏tftpboot的權限是777
c) 燒寫bootloader
tftp 0x30008000 u-boot.bin
nand erase 0 0x60000
nand write 0x30008000 0 0x60000
其中前面256K是boot, 128K是bootconfig
d) 燒寫kernel
tftpboot 0x30008000 zImage.img
nand erase 0x60000 0x500000
nand write 0x30008000 0x60000 0x500000
e) 因爲是ramfs,所以不需要額外燒寫rootfs分區了。
f) 設置bootloader自動加載內核
bootloader環境變量
u-boot2010.06@Daniel # printenv
bootdelay=3
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
ethact=dm9000
filesize=4E6590
fileaddr=30008000
netmask=255.255.255.0
ipaddr=192.168.2.105
serverip=192.168.2.15
bootcmd=nand read 0x30008000 0x60000 0x500000;bootm 0x30008000
stdin=serial
stdout=serial
stderr=serial
命令爲:
setenv bootcmd 'nand read 0x30008000 0x60000 0x500000;bootm 0x30008000'
saveenv