古いSH4から新しいSH4へのカーネルの移植に問題があります。それらの違いを見せてください。
[旧SH4]
ブートローダー:redboot v2.0
カーネルバージョン:2.4
[新しいSH4]
ブートローダー:u-boot v2009.03
カーネルバージョン:2.6
古いSH4では、多くのソースコードがカーネル2.4に基づいて開発されているため、カーネル2.4を新しいSH4に移植する方が、カーネル2.6でソースコードを再コンパイルするよりも簡単に見えます。そこで、以下に示すように、古いSH4用に開発されたzImageにmkimageを適用しました。
mkimage -A sh -O linux -T kernel -C none -a 0x8c210000 -e 0x8c210000 -n 'Old kernel' -d zImage uImage
この画像は、以下に示すように新しいSH4にロードされます。
tftpboot 8c800000 uImage
cp.b $(fileaddr) a0100000 $(filesize)
bootm a0100000
ただし、「Linuxの解凍... OK、カーネルの起動」後に起動が停止し、ハングします。kernel / head.Sの以下の行で無限ループが発生することがわかりましたが、kernel / head.Sはカスタマイズされておらず、古いSH4で動作するため、これらの行は問題ないと思います。
! Clear BSS area
mov.l 3f, r1 ! __bss_start
add #4, r1
mov.l 4f, r2 ! _end
mov #0, r0
9: cmp/hs r2, r1
bf/s 9b ! while (r1 < r2)
mov.l r0,@-r2
したがって、この問題は新旧のSH4の環境の違いに起因していると思います。古いSH4では、fconfigコマンドを実行し、以下のように変数を設定します。
Load Linux Kernel & File System: true
Linux Kernel Destination address: 0x8c210000
Linux Kernel Source address: 0x80140000
Linux Kernel Size: 0x100000
RAM disk Destination address: 0x8c360000
RAM disk Source address: 0x80140000
RAM disk Size: 0x400000
Modify Linux Kernel Parameter: true
Linux Kernel base address: 0x8c001000
Linux Kernel ENTRY address: 0x8c210000
Linux Kernel INITRD size: 0xc00000
Linux Kernel INITRD start address: 0x360000
Linux Kernel loader type: 1
Linux Kernel mount root read only: 1
Linux Kernel original root device: 0x100
Linux Kernel RAM disk flags: 0
Linux Kernel Enable Virtual Terminal Console: false
u-bootにはfconfigコマンドがありませんが、新しいSH4でこれらのパラメーターを設定できると思います。しかし、LinuxカーネルのソースアドレスとLinuxカーネルのベースアドレスのパラメーターを設定する方法が見つかりませんでした。これはハングの問題に関連していますか?または、Linux組み込みシステムを初めて使用するので、次に何を確認する必要があるかについてのアドバイスが役立ちます。
ご協力いただきありがとうございます。
[編集]
u-bootでprintenvの結果を表示するために、以下の情報が追加されました。
bootcmd = icache on
bootm a0100000
bootdelay = 2
baudrate = 115200
netmask = 255.255.255.0
ipaddr = 192.168.1.2
serverip = 192.168.1.1 Gatewayip
= 0.0.0.0
bootargs = console = ttySC1,115200、N、8 mem = 32M ether = 8、 0x1300,0,0、eth0 video = e1356fb:system:ms104sh4、display:crt、bpp:8,800x600 @ 60
stdin = serial
stdout = serial
stderr = serial