cs8900a포팅 중에 궁금한것이있어서 글을 남김니다.
제가 사용하는 보드는 LN2440sbc인데 2.6.13커널을 올리고 드라이버를 올리는 중에
드라이버는 올라갔는데 인터럽트만 걸리면 패닉걸려서 해결을 못하고 있습니다.
커널메세지...
done
Bytes transferred = 1517490 (1727b2 hex)
## Starting application at 0x33000000 ...
Uncompressing Linux.................................................................. done, booting the kernel.
CPU: ARM920Tid(wb) [41129200] revision 0 (ARMv4T)
Machine: SMDK2440
Warning: bad configuration page, trying to continue
Memory policy: ECC disabled, Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C2440: core 390.000 MHz, memory 130.000 MHz, peripheral 65.000 MHz
S3C2410 Clocks, (c) 2004 Simtec Electronics
CPU0: D VIVT write-back cache
CPU0: I cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
CPU0: D cache: 16384 bytes, associativity 64, 32 byte lines, 8 sets
Built 1 zonelists
Kernel command line: root=/dev/ram0 rw initrd=0x30800000,8M console=ttySAC0 mem=64M
irq: clearing subpending status 00000002
PID hash table entries: 512 (order: 9, 8192 bytes)
timer tcon=00500000, tcnt d395, tcfg 00000200,00000000, usec 000017a1
Console: colour dummy device 80x30
Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
Memory: 64MB = 64MB total
Memory: 54528KB available (1693K code, 330K data, 96K init)
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
checking if image is initramfs...it isn't (no cpio magic); looks like an initrd
Freeing initrd memory: 8192K
NET: Registered protocol family 16
S3C2440: Initialising architecture
S3C2440: IRQ Support
S3C2440: Clock Support, UPLL 96.000 MHz
S3C2410 DMA Driver, (c) 2003-2004 Simtec Electronics
DMA channel 0 at c4800000, irq 33
DMA channel 1 at c4800040, irq 34
DMA channel 2 at c4800080, irq 35
DMA channel 3 at c48000c0, irq 36
NetWinder Floating Point Emulator V0.97 (extended precision)
Initializing Cryptographic API
Console: switching to colour frame buffer device 80x25
fb0: Virtual frame buffer device, using 1024K of video memory
io scheduler noop registered
io scheduler anticipatory registered
io scheduler deadline registered
io scheduler cfq registered
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
nbd: registered device at major 43
cs89x0:cs89x0_probe(0x0)
PP_addr=0x3000
cs89x0.c: v2.4.3-pre1 Russell Nelson <
[email protected]>, Andrew Morton <
[email protected]>
eth0: cs8900 rev K found at 0xfc000300
cs89x0: Extended EEPROM checksum bad and no Cirrus EEPROM, relying on command line
cs89x0 media RJ-45, IRQ 18, programmed I/O, MAC 00:00:c0:ff:ee:08
cs89x0_probe1() successful
cs89x0:cs89x0_probe(0x0)
cs89x0: request_region(0xfc000300, 0x10) failed
cs89x0: no cs8900 or cs8920 detected. Be sure to disable PnP with SETUP
mice: PS/2 mouse device common for all mice
NET: Registered protocol family 2
IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
TCP established hash table entries: 4096 (order: 3, 32768 bytes)
TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
TCP: Hash tables configured (established 4096 bind 4096)
TCP reno registered
TCP bic registered
NET: Registered protocol family 1
NET: Registered protocol family 17
RAMDISK: Compressed image found at block 0
VFS: Mounted root (ext2 filesystem).
Freeing init memory: 96K
init started: BusyBox v0.60.5 (2003.08.02-05:17+0000) multi-call binary
Sat Jul 26 21:42:00 UTC 2003
Please press Enter to activate this console. Unable to handle kernel paging request at virtual address ee000300
pgd = c3aa8000
[ee000300] *pgd=00000000
Internal error: Oops: 5 [#1]
CPU: 0
PC is at .insw_align+0x8/0x14
LR is at net_rx+0xfc/0x1a8
pc : [<c01a9164>] lr : [<c012c354>] Not tainted
sp : c01c9ea0 ip : 00000000 fp : c01c9ed0
r10: ee000300 r9 : c3af8620 r8 : c3faae12
r7 : c3af8400 r6 : 00000062 r5 : c0e719e0 r4 : fc000300
r3 : 00000062 r2 : 00000031 r1 : c3faae12 r0 : ee000300
Flags: nZCv IRQs on FIQs on Mode SVC_32 Segment kernel
Control: C000717F Table: 33AA8000 DAC: 00000017
Process swapper (pid: 0, stack limit = 0xc01c8194)
Stack: (0xc01c9ea0 to 0xc01ca000)
9ea0: 00000000 c01c9ec8 c0e67c00 c3af8400 c3af8620 00000904 c01daf0c 41129200
9ec0: 00000001 c01c9ef8 c01c9ed4 c012bf90 c012c268 c0e67c00 00000012 00000000
9ee0: 00000000 c01c9f54 3001d99c c01c9f1c c01c9efc c00218ec c012bf0c c01fea4c
9f00: 00000012 c0e67c00 c01c9f54 3001d9cc c01c9f3c c01c9f20 c0021a4c c00218a0
9f20: c01c9f54 c01c9f88 00000001 c021aaf4 c01c9f50 c01c9f40 c0021cc8 c00219ac
9f40: ffffffff c01c9fa8 c01c9f54 c0020724 c0021c8c c001d480 ffffffff f040000c
9f60: 80000013 c00225bc c01c8000 c0207c6c c021aaf4 3001d9cc 41129200 3001d99c
9f80: c01c9fa8 c01c9f8c c01c9f9c c00224dc c0022604 80000013 ffffffff c01c9fc0
9fa0: c01c9fac c0022654 c00225cc 00000000 c01fe258 c01c9fd0 c01c9fc4 c0020024
9fc0: c002261c c01c9ff4 c01c9fd4 c00087f8 c0020010 c0008394 c01ff908 c0007175
9fe0: c01ff87c c01cb010 00000000 c01c9ff8 30008098 c0008690 00000000 00000000
Backtrace:
[<c012c258>] (net_rx+0x0/0x1a8) from [<c012bf90>] (net_interrupt+0x94/0x2f8)
[<c012befc>] (net_interrupt+0x0/0x2f8) from [<c00218ec>] (__do_irq+0x5c/0x9c)
[<c0021890>] (__do_irq+0x0/0x9c) from [<c0021a4c>] (do_edge_IRQ+0xb0/0x12c)
r8 = 3001D9CC r7 = C01C9F54 r6 = C0E67C00 r5 = 00000012
r4 = C01FEA4C
[<c002199c>] (do_edge_IRQ+0x0/0x12c) from [<c0021cc8>] (asm_do_IRQ+0x4c/0x74)
r7 = C021AAF4 r6 = 00000001 r5 = C01C9F88 r4 = C01C9F54
[<c0021c7c>] (asm_do_IRQ+0x0/0x74) from [<c0020724>] (__irq_svc+0x24/0x160)
r4 = FFFFFFFF
[<c00225bc>] (default_idle+0x0/0x50) from [<c0022654>] (cpu_idle+0x48/0x64)
[<c002260c>] (cpu_idle+0x0/0x64) from [<c0020024>] (__init_end+0x24/0x2c)
r5 = C01FE258 r4 = 00000000
[<c0020000>] (__init_end+0x0/0x2c) from [<c00087f8>] (start_kernel+0x178/0x1bc)
[<c0008680>] (start_kernel+0x0/0x1bc) from [<30008098>] (0x30008098)
Code: e1a05424 eaffff47 e1b0cf81 1a00002a (e1d0c0b0)
<0>Kernel panic - not syncing: Aiee, killing interrupt handler!
OOPS메세지를 확인 해보니깐 MMU가 뭔가가 이상한것같아서 이솝보드의
cs8900드라이버를 보니
////////////////////////// driver/net/cs89x0.c
static unsigned int netcard_portlist[] __initdata = {AESOP_VA_CS8900A + DEFAULTIOBASE, 0};
static unsigned int cs8900_irq_map[] = {IRQ_EINT9, 0, 0, 0};
///////////////////// aesop-map.h
#define AESOP_VA_IOBASE 0xF8000000
#define AESOP_VA_CS8900A AESOP_VA_IOBASE /* 0xF8000000 */
#define AESOP_PA_CS8900A (S3C2410_CS3 + 0x1000000) /* 0x19000000 */
#define AESOP_SZ_CS8900A SZ_1M
//////////////////////arch/arm/mach-s3c2410/mach-aesop2440.c
static struct map_desc aesop2440_iodesc[] __initdata = {
{ AESOP_VA_CS8900A, AESOP_PA_CS8900A, AESOP_SZ_CS8900A, MT_DEVICE },
{ (unsigned long)S3C24XX_VA_IIS, S3C2410_PA_IIS, S3C24XX_SZ_IIS, MT_DEVICE },
};
이렇게 코딩이 되어있는데 궁금한것이
왜 AESOP_VA_CS8900A 이 0xF8000000 이 되고 AESOP_PA_CS8900A이
0x19000000의 값을 가지는지
어떻게 해서 이값이 계산된것인지 이해가 되지않아서 모질라는 실력을 한탄하며
글을 남김나다 ㅠㅠ
ln2410의 경우 예전에도 그것때문에 어떤 분이 꽤 오래 헤맸었습니다.
ln2440은 제가 회로도를 확인 못해봐서 memory mode인지 io mode
인지 잘 모르겠네요.
일단 기본적인 u-boot와 linux kernel의 cs8900은 io mode로 동작되게 되어 있습니다.
시랩시스에서 조금은 복잡하게 그 부분을 메모리 모드로 사용해
버려서, sw에서 고쳐줘야 했습니다. 아마도 의도적이지 싶네요.
결론적으로 회로도를 보시고 memory mode라면 aesop 커널의
driver를 일일이 memory mode로 손봐주셔야 할 겁니다.
2.4.18 커널용 memory mode 소스는 다음 eLinux cafe의 자료실
에 아마도 있을겁니다.
그 부분을 참조하시기 바랍니다.
그리고, cs8900이 io mode로 동작할때는 base address + 0x01000000 서부터 시작합니다.(물론 여기에 다시 0x300을 더해야
하지만요)
그래서 0x19000000 이 나오는 겁니다.