여기저기서 찾아보느라 삽질을 많이 했는데, 역시 구글신을 믿었어야 했다 -_-;

구글신께 빌어본 결과... http://www.mneuroth.de/privat/zaurus/madplay.html 을 보니 자세히 알게 됐다 -_-;

우선 madplay-0.15.2b.tar.gz와 libmad-0.15.1b.tar.gz, libid3tag-0.15.1b.tar.gz, zlib-1.1.4.tar.gz가 필요하다.

각각의 압축을 풀고 다음과 같이 설정한다.

$ export CC=arm-linux-gcc
$ export CXX=arm-linux-gcc
$ export CPPFLAGS='-I../libmad-0.15.1b -I../libid3tag-0.15.1b -I../zlib-1.1.4'
$ export LDFLAGS='-L../libmad-0.15.1b -L../libid3tag-0.15.1b -L../zlib-1.1.4'


먼저 zlib-1.1.4부터 compile 하도록 한다.

$ ./configure
$ make


다음은 libid3tag-0.15.1b

$ ./configure --host=arm
$ make


다음은 libmad-0.15.1b

$ ./configure --host=arm
$ make


마지막으로 madplay-0.15.2b (libesd, libaudiofile과 관련이 있다면 --without-esd를 빼도록 한다)

$ ./configure --host=arm --without-esd
$ make


마지막 madplay의 compile 결과물로 madplay가 생기는데, 이것을 다음과 같이 실행하면 재생된다.

# ./madplay a.mp3


이렇게 하면 완료.
Posted by 강군님

댓글을 달아 주세요

  1. rebis 2007.12.13 05:44  댓글주소  수정/삭제  댓글쓰기

    libmad configure 중 synth.c에서 오류가 발생하는데요..dct32 function에 관한

  2. Favicon of https://kangun.tistory.com 강군님 2007.12.19 15:40 신고  댓글주소  수정/삭제  댓글쓰기

    '') 이것만 가지고는... 뭐라 말씀드리기 그렇네요. 다만 디렉토리의 구조는 다음과 같아야 합니다.

    - madplay
    - libmad
    - libid3tag
    - zlib

    제가 사용한 크로스 컴파일러의 버전은 3.4입니다.

nfs를 사용하면서 모듈 테스트할때까지는 좋았는데, qt를 사용하면서 라이브러리 크기가 급격히 커진 이후로 별 상관은 없었지만 어쨌든 루트 파일 시스템을 nfs로 활용하고 싶어졌다.

1. 커널 옵션 중 cmd arg를 변경한다.
General setup의 Default kernel command string을 수정한다.

root=/dev/nfs rw nfsroot=192.168.0.100:/home/freemckang/nfs ip=192.168.0.200:192.168.0.100:192.168.0.100:255.255.255.0::eth0:off console=ttyS0,115200

인데... 전제조건은 다음과 같다.

host ip : 192.168.0.100
host nfs directory : /home/freemckang/nfs
board ip : 192.168.0.200
netmask : 255.255.255.0
gateway ip : 192.168.0.100 (host와 board를 1:1로 연결시켜서 별 의미는 없다)
board interfacename : eth0
board console : ttyS0
board console baudrate : 115200

root=/dev/nfs는 nfs를 rootfs를 사용하겠다는 의미인데 실제로 /dev/nfs는 없다. 이상한 것은 kernel의 Documentation/nfsroot.txt를 읽어보면 rdev를 사용할 때 이것이 필요한데, (major : 0, minor 255) 실제로는 사용하지 않았다는 것이다. board에서는 필요 없는 것인가...

nfsroot=192.168.0.100:/home/freemckang/nfs는 shell에서 nfs를 마운트시킬때와 같다고 보면 된다.

ip=192.168.0.200:192.168.0.100:192.168.0.100:255.255.255.0::eth0:off는 board의 ip가 192.168.0.200, host ip가 192.168.0.100, gatewayip가 192.168.0.100, netmask가 255.255.255.0, hostname이 없음, interfacename이 eth0, autoconf를 사용하지 않겠다는 것인데, 자세한 내용은 역시 Documentation/nfsroot.txt를 참조하면 된다.

console=ttyS0,115200은 굳이 설명할 필요가 없을 것 같다.

2. kernel의 networking option 변경

Networking option > IP: kernel level autoconfiguration을 built-in 시키고 이에 의존적인 IP:DHCP support, IP:RARP support, IP:BOOTP support를 built-in 시킨다.

3. kernel의 filesystem 변경

File systems > Network File Systems > NFS File system support에 의존적인 Root file system on NFS를 built-in 시킨다.

1, 2, 3 과정이 완료되었으면 make zImage시키고 arch/arm/boot/zImage를 /tftpboot로 복사한다.

4. rootfile system 생성

자기가 만들던지, 기존에 있던 것을 복사하던지 해서 (현재 /home/freemckang/nfs에 구현함) rootfs를 만드는데, 기존에 있던 것을 복사할 때는 주의해야 할 사항이 있다. rootfs의 etc/rc.d/init.d의 network에 ip를 설정하는 부분이 있는데, rootfs의 tmp 디렉토리에 있는 rebis2440_cfg를 수정하던가 그 줄에 아예 하드코딩으로 박아버리던가 하는식으로 위에서 설정한 ip가 변경되지 않도록 한다. (변경되면 당연히 nfs가 끊기므로 안된다!)

5. booting

u-boot prompt에서 kernel image만 down 받고 go한다.

잘된다. 다만 1번 과정의 cmd arg를 설정하는 것을 원래 u-boot에서 bootargs를 사용하면 넣을 수가 있는데, 잘 먹지가 않아서 그냥 kernel configuration에 넣어버렸다 -_-; 요건 좀 마음에 안든다. 안되는 수가 있는데 RPC: 어쩌고 에러나면 일단 nfs의 연결을 의심해보고, etc/mtab이나 fstab을 의심해보면 될듯 하다.

그리고 /dev/nfs를 활용하는 쪽에 대해서도 좀 찾아봐야 될 듯 싶다. 짐작으로는 원래 diskless 시스템을 만들기 위해 사용된 기법이니만큼 그쪽에서 사용할 수 있도록 쓰여진 documetation이 아닌가 싶은데, 다시 한번 살펴봐야할 과제로 남겨두고 이건 여기까지...
Posted by 강군님

댓글을 달아 주세요

      

강의시간에 사용한 proc 관련 kernel module code인데, 이전에는 tq_immediate에 등록했을 경우에 task queue가 바로 실행되지 않는문제가 있었는데, 실행되게 하는 방법을 찾았다.

#include <linux/interrupt.h>

    ...
    queue_task (&immediate_tq, &tq_immediate);
    mark_bh (IMMEDIATE_BH);
    ...

mark_bh (IMMEDIATE_BH); 를 함으로써 tq_immediate에 등록된 task queue의 실행이 가능해졌다. 알아본 결과, tq_immediate가 실행되는 '즉시'를 kernel 2.4에서는 software interrupt가 발생된 시점으로 본다. 이 software interrupt를 발생시키는 것이 바로 mark_bh ()이다.

kernel 2.6에서는 사용할 일이 없는 함수이긴 하지만 궁금했던 문제가 하나 해결됐다.

Posted by 강군님

댓글을 달아 주세요

$ sudo apt-get install nfs-kernel-server nfs-common portmap

rpcbind

설치가 되면, /etc/exports에 다음 내용을 추가한다.

/mnt/nfs xxx.xxx.xxx.xxx/xx(rw,no_root_squash,async)

물론... xxx.xxx.xxx.xxx/xx는 board에서 사용될 ip와 netmask이다 (255.255.255.0의 netmask일 경우 24)
$ sudo /etc/init.d/portmaprpcbind-boot restart
$ sudo /etc/init.d/nfs-kernel-server restart
$ sudo exportfs -a

nfs server 서비스 시작할때, 메세지가 나오는데, 무시해도 상관없다.

마무리 되었으면, 보드에서 ip와 netmask를 셋팅하고, 다음과 같이 하여 마운트 시킨다.
# mkdir nfs
# mount -t nfs xxx.xxx.xxx.xxx:/mnt/nfs ./nfs

물론 xxx.xxx.xxx.xxx는 host의 ip이다. /mnt/nfs는 host에서 nfs로 설정된 디렉토리.
이상 간단한 ubuntu에서의 nfs 설정기~

2007년 11월 22일 수정분:
MDS에 rebis2440용 2.6 커널이 떴다. 반가운 마음에 잘 썼는데 문제는 nfs 할 때 눈엣가시같은 메세지가 뜬다는 거다.  바로...

portmap: RPC call returned error 101
RPC: failed to contact portmap (errno -101).
portmap: RPC call returned error 101
RPC: failed to contact portmap (errno -101).
lockd_up: makesock failed, error=-101
portmap: RPC call returned error 101
RPC: failed to contact portmap (errno -101).

에러메세진데 왜 마운트가 되는거냐 -_-; 어쨌든 꼴보기 싫으니까 구글링.

It's not a BusyBox "error" but it probably is a BusyBox "quirk". There are several tricks to getting BusyBox to mount an NFS volume.

1) BusyBox mount defaults to NFS version 3. You need to make sure that your

NFS server supports v3, and that your host kernel is compiled to support v3.  
Or you can force version 2 by adding "-o vers=2" to the mount command.

2) You're getting RPC errors because you don't have a portmap daemon running
on your host. You can either run a portmap daemon, or bypass it with the "-o
nolock" option.

3) Someone has reported needing to force BusyBox mount to mount version 2.
This is a "-o mountvers=2".
검색결과, 마운트시 nolock 옵션을 줘야 하는 것으로 밝혀졌다.

mount -t nfs xxx.xxx.xxx.xxx:/mnt/nfs ./nfs -o nolock

에러메세지가 없다.


2007년 12월 24일 수정본:
아 쓰... 공유기에 붙여서 브로드캐스팅 어쩌고 작업하는데 문제가 좀 있었다. 그 와중에 nfs server의 service를 몇번 재시동 시킬때마다 나는 저놈의 워닝 메세지가 보기 싫어졌다. 그래서 수정.

/mnt/nfs xxx.xxx.xxx.xxx/xx(rw,subtree_check,no_root_squash,async)

그건 그렇고... 다이렉트로 물렸을땐 전혀 문제가 안되던 것이 공유기에 꼽아놓고 nfs를 마운트 시키니 큰 파일을 리딩할려면 not responding, still trying 어쩌고.. 하는 메세지가 뜨면서 에러다! 결국 찾아보고 찾아본 결과... nfs가 기본으로 udp를 쓰며 저럴 경우에는 tcp로 바꾸든가 packet 크기를 줄여야 한다네... 그래서 마운트 옵션을 또 변경.

mount -t nfs xxx.xxx.xxx.xxx:/mnt/nfs /mnt/nfs -o nolock,rsize=32768,wsize=32768,tcp

오케이.
Posted by 강군님

댓글을 달아 주세요

아래는 led.c의 내용이다.

#define MODULE
#include <linux/module.h>
#include <linux/kernel.h>
#include <asm-arm/arch/s3c2440.h>

int init_module (void)
{
    printk ("led module is started\n");

    rGPECON &= ~0x3C00000;
    rGPECON |= 0x1400000;
    rGPEDAT &= ~0x1800;

    return 0;
}

void cleanup_module (void)
{
    printk ("led module is exited\n");
}

3번째 #include 에서의 s3c2440.h는 2440 보드를 제어하기 위한 각종 주소들이 define 되어 있는 헤더 파일이다. rGPECON은 Port-E의 Control address, rGPEDAT는 Port-E의 Data address이다.

s3c2440A의 매뉴얼을 보면 (274P) GPECON은 0x56000040 번지이고, GPEDAT는 0x56000044 인 것을 알 수 있다. 보드의 LED 부분을 보면 LED2는 GPE12로, LED4는 GPE11로 되어 있는 것을 알 수 있다. (이것을 먼저 알고 있기 때문에 Port-E에서 작동한다는 것을 알 수 있는 것이다)

GPECON에서 GPE12는 25~24번 비트를 사용하고 GPE11은 23~22비트를 사용하는데, 매뉴얼에서 보여지다시피, Output을 원한다면 각 비트의 값을 01로 바꾸어야 하는데, 그냥 OR 연산을 하는 것이 아니라 먼저 해당 비트의 값들을 클리어 시켜주고(어셈 명령으로는 BIC) 해당 24번과 22번 비트에 1을 OR 시켜주는 형식을 취해야 한다.

그렇다면, C에서는 &~ 연산으로 해당 주소에 0x3C00000을 넣어주면, 25, 24, 23, 22번 비트가 클리어 되고 | 연산으로 0x1400000을 넣어주면 24, 22번 비트가 1로 셋이 된다. 이렇게 되면 일단 GPECON에 대한 작업은 끝난 것이다.

그 다음으로는 GPEDAT에 대한 작업을 해주어야 하는데, 매뉴얼에서 보다시피 0을 넣었을 때에 LED에 불이 들어오게끔 되어있다. 따라서 GPEDAT의 12번과 11번을 0으로 클리어 시켜주면 ( &~ 0x1800) 된다.

소스 작성이 끝나면, Makefile을 만들어야 한다.

KERNELDIR = 보드에 올라갈 커널 소스가 있는 디렉토리
CC = arm-linux-gcc
CFLAGS = -D__KERNEL__ -DMODVERSION -I$(KERNELDIR)/include -O -Wall

all : led.o

clean : rm -rf *.o

처럼 간단히 작성하면 된다. 당연히 CC에 들어가는 arm-linux-gcc는 arm용 컴파일러이며, 패스가 지정이 되어있어야 한다.

CFLAGS에서 눈여겨 보아야 할 것은 -DMODVERSION이다. 호스트의 커널 버전과 상관없이 컴파일을 할 수 있다.

두개의 파일을 작성하고 make를 하면 led.o가 작성이 되고, 이것을 보드에서 insmod를 하게 되면 해당 LED에 불이 들어오는 것을 확인할 수 있다.
Posted by 강군님
TAG LED, rebis2440

댓글을 달아 주세요

별거 없는데... 글 수정이 귀찮아서... 그냥... 글로 남김...

$ gunzip ramdisk-rebis.gz
$ mkdir mnt_ramdisk
$ sudo mount -o loop ramdisk-rebis mnt_ramdisk
$ ... 각종 수정 작업 ...
$ sudo umount mnt_ramdisk
$ gzip ramdisk-rebis

초간단 rebis2440용 ramdisk 수정기.
Posted by 강군님

댓글을 달아 주세요