S3C2440A에 Embedded Linux-Xenomai 포팅

  예전에 PXA270에 Embedded Linux-Xenomai를 포팅하여 휴머노이드로봇의 주 제어용으로 사용했었고, Ethernet용 RTDM을 제작하여 Ethernet을 이용한 실시간 제어 가능성 확인용으로도 활용해 봤었다.
  이번엔 안쓰는 구형 네이비게이터에 장착된 S3C2440A(400MHz)에 Embedded Linux-Xenomai를 포팅해봤다. 궁금해서 기기를 까보니 S3C2440A이 보이길레 한번 올려본 것이다.
  사용한 네비게이터는 엠텍반도체라는 곳에서 2006년에 만든 CARON FDN4000모델이다
[CARON FDN4000]

  뚜껑을 따보니 메인기판 1개와 LCD로 구성된 아주 깔끔한 구조였다.
[분해]


[기판 부품면]

[기판 반대면]
  우선 기본적인 외부 I/O를 확인한다. 다행이 UART가 2.5mm 마이크로 폰잭으로 나와 있었다. 터미널을 연결해 뭐라는지 들어보니 E-Boot와 WinCE 조합이었다.
  시리얼 부팅등 간단한 방법이나 사용 가능한 툴등이 있는지 메뉴얼, 인터넷등을 뒤져 봤는데 없다. JTAG을 붙여서 바닥부터 시작해야 할 듯 하다. JTAG 디버그 포트를 찾아 봤으나 핀헤더나 핀헤더가 있었을 법한 껀덕지는 아무데도 없었다. 여기저기 유심히 보던중 아래 그림처럼 SD카드 슬롯이 있는, 보드 끝자락에 뭔가 컨텍이 있을법한 곳이 눈에 띤다.
  맞다. JTAG디버그 포트가 맞다. 나만의 나름(?) 노하우로 JTAG포트임을 확인하고 TMS, TCK, TDO, TDI등 핀배열을 찾아 냈다. 난 역시 대단해 움하하... 이 때도 역시 일전에 만들어 쓰고있는 나의 보물 USB-JTAG이 아주 큰 도움이 되었다.
  S3C2440A는 ARM9TDMI코어로 JTAG 연동을 위해 Embedded ICE를 구현하면 메모리 읽기 쓰기등이 가능해 진다. 일전에 같은 ARM9TDMI 기반인 KS8695보드 리버스 엔지니어링을 위해 구현했던 코드를 그대로 활용해 S3C2440A용을 만들어 USB-JTAG에 심어 주었다.
[디버깅을 위해 JTAG단자 인출]
  아래와 같이 H/W 개발 환경을 꾸며주었다. 우선 기본 내장된 펌웨어를 모조리 읽어 파일로 저장해 놓은 다음 플래시 메모리를 깨끗하게 지우고 시작 한다.
  부트로더 만들어 올리고, 리눅스 커널 부팅을 위한 ATAG도 만들어 주고, 이더넷 포트가 없으니 커널/램디스크 다운로드용 USB포트도 뚫어 주고, 호스트PC용 USB 디바이스 드라이버도 만들어 주고, 커널 패치하고, 커널 설정 하고, 빌드하고, BusyBox 구성해 주고, 램디스크 만들어주고 보드에 올리면 된다. 참 쉽죠?
[H/W 개발환경]
  사용한 커널 조합은 linux-2.6.28.8과 xenomai-2.6.0-rc이다. ramdisk 마운트 하는데 애를 좀 먹었다. crosstool-ng로 툴체인을 만들어 쓰고 있는데 요놈에 버그가 있었다. 툴체인 버그로 생긴 문제는 도무지 찾기가 힘들다...
  Xenomai가 패치된 커널 메시지는 아래와 같다.
-------------------------------------------------------------------
Uncompressing Linux... done, booting the kernel.
Linux version 2.6.38.8-xenokang (root@localhost.localdomain) (gcc version 4.7.3 (crosstool-NG 1.19.0) ) #1 PREEMPT Wed Nov 19 16:23:11 KST 2014
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVT instruction cache
Machine: FDN4000
Memory policy: ECC disabled, Data cache writeback
[FDN4000] fdn4000_map_io()
CPU S3C2440A (id 0x32440001)
S3C24XX Clocks, Copyright 2004 Simtec Electronics
S3C244X: core 400.000 MHz, memory 133.333 MHz, peripheral 66.666 MHz
CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 16256
Kernel command line: console=ttySAC1,57600 initrd=0x32200000,5M ramdisk=16384 root=/dev/ram0
PID hash table entries: 256 (order: -2, 1024 bytes)
Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 57636k/57636k available, 7900k reserved, 0K highmem
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
    DMA     : 0xffc00000 - 0xffe00000   (   2 MB)
    vmalloc : 0xc4800000 - 0xf6000000   ( 792 MB)
    lowmem  : 0xc0000000 - 0xc4000000   (  64 MB)
    modules : 0xbf000000 - 0xc0000000   (  16 MB)
      .init : 0xc0008000 - 0xc001f000   (  92 kB)
      .text : 0xc001f000 - 0xc01e0000   (1796 kB)
      .data : 0xc01e0000 - 0xc01f2e00   (  76 kB)
SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
Preemptable hierarchical RCU implementation.
        RCU-based detection of stalled CPUs is disabled.
        Verbose stalled-CPUs detection is disabled.
NR_IRQS:85
irq: clearing subpending status 000000d2
I-pipe, 11.111 MHz clocksource
I-pipe 1.18-09: pipeline enabled.
Console: colour dummy device 80x30
console [ttySAC1] enabled
Calibrating delay loop... 199.06 BogoMIPS (lpj=497664)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 512
CPU: Testing write buffer coherency: ok
gpiochip_add: gpios 288..303 (GPIOK) failed to register
gpiochip_add: gpios 320..334 (GPIOL) failed to register
gpiochip_add: gpios 352..353 (GPIOM) failed to register
[FDN4000] fdn4000_init()
S3C2440: Initialising architecture
S3C2440: IRQ Support
S3C244X: Clock Support, DVS off
bio: create slab at 0
Trying to unpack rootfs image as initramfs...
rootfs image is not initramfs (no cpio magic); looks like an initrd
Freeing initrd memory: 5120K
I-pipe: Domain Xenomai registered.
Xenomai: hal/arm started.
Xenomai: scheduling class idle registered.
Xenomai: scheduling class rt registered.
Xenomai: real-time nucleus v2.6.0-rc5 (head) loaded.
Xenomai: starting native API services.
Xenomai: starting RTDM services.
io scheduler noop registered
io scheduler deadline registered
io scheduler cfq registered (default)
s3c2440-uart.0: ttySAC0 at MMIO 0x50000000 (irq = 70) is a S3C2440
s3c2440-uart.1: ttySAC1 at MMIO 0x50004000 (irq = 73) is a S3C2440
s3c2440-uart.2: ttySAC2 at MMIO 0x50008000 (irq = 76) is a S3C2440
brd: module loaded
mousedev: PS/2 mouse device common for all mice
RAMDISK: gzip image found at block 0
VFS: Mounted root (ext2 filesystem) on device 1:0.
Freeing init memory: 92K
init started: BusyBox v1.22.1 (2014-11-28 14:19:48 KST)
starting pid 24, tty '': '/etc/init.d/rcS'

Please press Enter to activate this console.
starting pid 30, tty '': '-/bin/sh'
[root@s3c2440 /]#
[root@s3c2440 /]#
[root@s3c2440 /]# ./xenomai/bin/latency
== Sampling period: 1000 us
== Test mode: periodic user-mode task
== All results in microseconds
warming up...
RTT|  00:00:01  (periodic user-mode task, 1000 us period, priority 99)
RTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat worst
RTD|     -4.681|      3.510|     36.090|       0|     0|     -4.681|     36.090
RTD|     -4.681|      3.600|     40.230|       0|     0|     -4.681|     40.230
RTD|     -4.681|      3.600|     42.930|       0|     0|     -4.681|     42.930
RTD|     -4.681|      3.600|     42.660|       0|     0|     -4.681|     42.930
RTD|     -4.681|      3.600|     42.480|       0|     0|     -4.681|     42.930
RTD|     -4.681|      3.600|     43.920|       0|     0|     -4.681|     43.920
RTD|     -4.681|      3.600|     42.480|       0|     0|     -4.681|     43.920
RTD|     -4.681|      3.690|     47.250|       0|     0|     -4.681|     47.250
RTD|     -4.681|      3.600|     42.660|       0|     0|     -4.681|     47.250
RTD|     -4.681|      3.600|     41.760|       0|     0|     -4.681|     47.250
RTD|     -4.681|      3.600|     42.030|       0|     0|     -4.681|     47.250
RTD|     -4.681|      3.600|     42.660|       0|     0|     -4.681|     47.250
RTD|     -4.681|      3.600|     43.830|       0|     0|     -4.681|     47.250
RTD|     -4.681|      3.600|     42.390|       0|     0|     -4.681|     47.250
RTD|     -4.681|      3.600|     42.660|       0|     0|     -4.681|     47.250
RTD|     -4.681|      3.600|     42.930|       0|     0|     -4.681|     47.250
RTD|     -4.681|      3.600|     43.200|       0|     0|     -4.681|     47.250
RTD|     -4.681|      3.600|     43.110|       0|     0|     -4.681|     47.250
RTD|     -4.681|      3.600|     41.580|       0|     0|     -4.681|     47.250
RTD|     -4.681|      3.600|     42.390|       0|     0|     -4.681|     47.250
RTD|     -4.681|      3.600|     44.280|       0|     0|     -4.681|     47.250
RTT|  00:00:22  (periodic user-mode task, 1000 us period, priority 99)
RTH|----lat min|----lat avg|----lat max|-overrun|---msw|---lat best|--lat worst
RTD|     -4.681|      3.600|     42.840|       0|     0|     -4.681|     47.250
RTD|     -4.681|      3.600|     42.030|       0|     0|     -4.681|     47.250
^C---|-----------|-----------|-----------|--------|------|-------------------------
RTS|     -4.681|      3.600|     47.250|       0|     0|    00:00:23/00:00:23
[root@s3c2440 /]#
[root@s3c2440 /]#
-------------------------------------------------------------------

  실시간 태스크 어플리케이션 동작이 확인되고 커널과 램디스크만 올라간 상태라 이제 시작이긴하다. fb붙여서 LCD도 돌려보고, 주변에 덕지덕지 붙어있는 터치판넬, 오디오, 비디오, GPS, FM 송신칩 등등도 해보면 재미질것 같다. 데이터 시트나 메뉴얼을 구할 수 없는 칩들이 몇 개 있어 좀 제한적이긴 하겠다.
  요놈은 하우징이 깔끔한 완제품이라 어디 좋은데 쓸수 있게 만들면 훌륭할거 같으다.