Tinyhack.com

Porting Linux Kernel 2.6.25.4 To STAR STR9100 (Agestar)

There are quite many limitations using old kernel for Agestar, one of them is you can not install the latest Linux distribution. I am eager to make the new Linux kernel to work on the agestar hardware. So since my last post, mainly I am just hacking at the kernel and not at the userspace stuff. As of today, I managed to boot the new kernel, and wrote a serial driver for it (you can see the boot messages at the end of this post). My next target is to port the USB and/or NIC driver.

As you may have read from my earlier posts, there are no documentations available for the STR 9100 hardware, so I based my work on the source code of the earlier kernel (I can’t believe so many things have changed since the 2.4.36). The initial work is quite easy if you are an experienced kernel developer. Because I am not experienced, I need to study quite many things before reaching the current state.

Because I don’t have any documentation about the FA526 CPU, I took the CPU specific code from the Icy Box. They provide the source code for Kernel 2.6. The SoC uses the same Processor, but completely different hardware for the rest (well, something is better than nothing). For the serial port, I realized that the serial port used is "High-speed 16C550-compliant UART serial channel" http://www.starsemi.com/vChn/Prods/str9104.php, so I studied the source code for 8250.c and added a small code to specify the the UART speed, register mapping, and memory location for the UART IO. This creates a much cleaner code than the original serial_str9100.c source code. The serial_str9100.c was 3799 lines of code, mine was about 100 lines of code (70 lines of code in a separate file, and the rest is adding register mapping to 8250.c).

My next plan is to work on the network driver. This should be not so difficult, at least I have higher hope to make this work compared to the USB part. The old network driver have some conditional compilation that indicates it can be compiled in kernel 2.6. I have tried to compile it, and there were many errors and warnings. I will try removing many codes that was not meant for the Agestar configuration (the kernel was from the WAP2000 router, so it contains router specific codes such as to acess hardware NAT).

The USB part is very important, without it then all of my work would be useless. The problem with the old source code was that it modifies directly some of the "core" USB stuff, instead of creating separate modules. The good news is it seems it doesn’t modify the source codes too much, but I still need to fully understand the code. I hope after this weekend, I can make the network and or the USB to work.

Here is my current boot message up until the user mode (many error messages because the network code was not compiled):

Linux version 2.6.25.4 (yohanes@koala) (gcc version 3.4.4) #235 Wed Jun 4 22:27:35 ICT 2008
CPU: FA526id(wb) [66015261] revision 1 (ARMv4), cr=0000397f
Machine: STAR_STR9100
Memory policy: ECC disabled, Data cache writeback
BUG: not creating mapping for 0x10000000 at 0x10000000 in user region
CPU0: D VIVT write-back cache
CPU0: I cache: 16384 bytes, associativity 2, 16 byte lines, 512 sets
CPU0: D cache: 16384 bytes, associativity 2, 16 byte lines, 512 sets
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 8128
Kernel command line: console=ttyS0,38400 root=/dev/ram0
PID hash table entries: 128 (order: 7, 512 bytes)
STR9100 CPU Clock: 200 MHz
IRQ Timer1 at interrupt number 0x0 and clock 100000000(Hz)
Dentry cache hash table entries: 4096 (order: 2, 16384 bytes)
Inode-cache hash table entries: 2048 (order: 1, 8192 bytes)
Memory: 32MB = 32MB total
Memory: 25612KB available (988K code, 133K data, 76K init)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
Exporting ATAGs: not enough memory
checking if image is initramfs...it isn't (no cpio magic); looks like an initrd
Freeing initrd memory: 5586K
NetWinder Floating Point Emulator V0.97 (double precision)
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered (default)
nvram: can't create /proc/driver/nvram
Serial: 8250/16550 driver $Revision: 1.90 $ 4 ports, IRQ sharing disabled
serial8250.10: ttyS0 at MMIO 0xf7800000 (irq = 10) is a 16550A
console [ttyS0] enabled
brd: module loaded
loop: module loaded
RAMDISK: Compressed image found at block 0
VFS: Mounted root (ext2 filesystem) readonly.
Freeing init memory: 76K
Mon Jan  1 00:00:00 UTC 2007
Mounting root fs rw ...
Load x1205 rtc driver ...
insmod: /lib/modules/2.6.25.4: No such file or directory
Using /lib/modules/2.4.27-star/x1205-rtc.o
insmod: Not configured to support old kernels
Synchronize system date & time ...
hwclock: Could not access RTC: No such file or directory
Mounting other filesystems ...
mount: Mounting none on /proc failed: No such device
ifconfig: socket: Function not implemented
route: socket: Function not implemented
ifconfig: socket: Function not implemented

System initialization begin!
open file error
Load configuration file OK!
(none)

Time zone setting OK!
Load nt_sev OK!
socket: Function not implemented

ifconfig: socket: Function not implemented


Network setting OK!
System time setting OK!
sh: �t@L������: not found
Http & Ftp OK!
Load automount OK!
Load button driver OK!
Load bittorrent job control deamon OK!
Load upnp av finished!
Load check disk full finished!
System initialization end!
Load printerd ...

printerd wakened
Sysinit done
telnetd: socket: Function not implemented


BusyBox v1.00-rc2 (2007.08.16-07:29+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

#
# ls
bin         lib         lost+found  sbin        var
dev         libexec     mnt         tmp         web
etc         linuxrc     proc        usr
# ls /dev
console    mkdev      ram0       sda7       sdc2       sdf        sdh3
dsp        mtd0       ram1       sda8       sdc3       sdf1       sdh4
fb0        mtd1       ram2       sdb        sdc4       sdf2       tty
hda        mtd2       ram3       sdb1       sdd        sdf3       tty0
hda1       mtd3       root       sdb2       sdd1       sdf4       ttyS0
hda2       mtdblock0  rtc        sdb3       sdd2       sdg        ttyS1
hdb        mtdblock1  sda        sdb4       sdd3       sdg1       urandom
hdb1       mtdblock2  sda1       sdb5       sdd4       sdg2       usb
hdb2       mtdblock3  sda2       sdb6       sde        sdg3       zero
kmem       null       sda3       sdb7       sde1       sdg4
md0        ppp        sda4       sdb8       sde2       sdh
md1        ptmx       sda5       sdc        sde3       sdh1
mem        pts        sda6       sdc1       sde4       sdh2
# ls -l
drwxr-xr-x    2 root     root         1024 Dec  7  2007 bin
drwxr-xr-x    4 root     root         2048 Nov  6 07:03 dev
drwxr-xr-x    7 root     root         1024 Jan  1 00:00 etc
drwxr-xr-x    4 root     root         2048 Dec  7  2007 lib
drwxr-xr-x    3 root     root         1024 Dec  7  2007 libexec
lrwxrwxrwx    1 root     root           11 Dec  7  2007 linuxrc -> bin/busybox
drwx------    2 root     root        12288 Dec  7  2007 lost+found
drwxr-xr-x    2 root     root         1024 Mar 13  2006 mnt
drwxr-xr-x    2 root     root         1024 Sep  1  2005 proc
drwxr-xr-x    2 root     root         1024 Dec  7  2007 sbin
drwxrwxrwt    2 root     root         1024 Jan  1 00:00 tmp
drwxr-xr-x    6 root     root         1024 Sep  1  2005 usr
drwxr-xr-x    6 root     root         1024 Sep  1  2005 var
drwxr-xr-x    4 root     root         1024 Dec  7  2007 web
# echo hello| gzip|gunzip
hello
# uname -a
Linux (none) 2.6.25.4 #235 Wed Jun 4 22:27:35 ICT 2008 armv4l unknown
# 
Exit mobile version