그동안 미루고 미룬 udev 포팅 성공기를 올립니다. 

 

테스트 타겟보드 :  EZ-S3C6410

  
1. udev 소스 받기
 
      http://www.kernel.org/pub/linux/utils/kernel/hotplug/
     
      에서 udev-124.tar.gz 를 다운로드 받습니다. ( udev-125.tar.gz 는 인스톨시 문제가 있네요. )
  

 
2. 압축 풀기

   root@tsheaven:udev# tar -zxvf udev-124.tar.gz
 

 
3 Makefile 수정하기
  
    root@tsheaven:udev# cd udev-124
    root@tsheaven:udev-124# vi Makefile
       
    87        prefix ?= ./_install

    103        CROSS_COMPILE ?= arm-generic-linux-gnueabi-

    115        LDFLAGS += -Wl,-warn-common,--as-needed,-s
 
   
4. 컴파일
 
      root@tsheaven:udev-124# make
     
      root@tsheaven:udev-124# vi udev_version.h
     
        1     /* Generated by make. */
        2     #define UDEV_VERSION "124"
        3     #define UDEV_ROOT "/dev"
        4     #define UDEV_CONFIG_FILE "./_install/etc/udev/udev.conf"
        5     #define UDEV_RULES_DIR "./_install/etc/udev/rules.d"
       
        를 다음과 같이 수정합니다.
       
        1     /* Generated by make. */
        2     #define UDEV_VERSION "124"
        3     #define UDEV_ROOT "/dev"
        4     #define UDEV_CONFIG_FILE "/etc/udev/udev.conf"
        5     #define UDEV_RULES_DIR "/etc/udev/rules.d"
 
    root@tsheaven:udev-124# make install
                                                  
    정상적으로 컴파일이 되고, 인스톨이 되었다면 아래와 같이 _install 디렉토리가 생성되고,
    이 디렉토리에 udev 관련 디렉토리 및 파일들이 생성됩니다.
   
    root@tsheaven:udev-124# ls _install/
    etc/  sbin/  usr/
   

5. 생성된 udev 관련 디렉토리 및 파일들을 램디스크 파일 시스템의 해당 디렉토리에 복사를 해 주면 됩니다.


6. 램디스크 파일 시스템에서 해야할 몇가지 작업.

    6.1. udev 데몬 실행 스크립트 파일 만들기
   
        타겟보드에서 부팅 -> 로그인 후에 다음과 같이 명령을 치면 udev를 실행 할 수 있습니다.
       
        /sbin/udevd --daemon
       
        위와 같이 명령으로 실행을 하면 되지만 원래의 목적이 부팅시 자동으로 udev를 실행하는 것이므로 다음과 같이
        스크립트 파일을 만들어 부팅시 실행을 하면 됩니다.
       
        아래의 스크립트는 현재 에프에이리눅스에서 제공하는 램디스크파일 시스템을 기준으로 하였습니다.
        만일 다른 램디스크 파일 시스템을 사용할 경우에는 이 스크립트파일이 실행 할 수 있는 곳에 두시면 됩니다.
       
        에프에이리눅스에서 제공하는 램디스크 파일 시스템의 구조는 다음과 같습니다.
       
        etc/rc.d/
        etc/rc.d/ini.d
        etc/rc.d/rc1.d
        etc/rc.d/rc2.d
        etc/rc.d/rc3.d
        etc/rc.d/rc4.d
        etc/rc.d/rc5.d
        etc/rc.d/rc6.d
   
       
        6.1.1 스크립트 파일 만들기
       
        [root@falinux etc/rc.d/init.d] vi udev
       
            #!/bin/sh
            PATH=$PATH:/sbin:/bin
           
            CMDLINE=$(cat /proc/cmdline)
           
            if [ ! -x /sbin/udevd ]
            then
                exit 0
            fi
           
            case "$1" in
                start)
                    echo "" > /proc/sys/kernel/hotplug
           
                    mount -n -o mode=0755 -t tmpfs tmpfs /dev
           
                    # Create static device nodes in /dev
                    mknod /dev/console c 5 1
                    mknod /dev/null c 1 3
           
                    echo "Starting the hotplug events dispatcher udevd"
                    udevd --daemon
           
                    echo "Synthesizing initial hotplug events"
                    udevtrigger
                    udevsettle --timeout=300
           
                    mkdir /dev/pts
                    mount -n -t devpts devpts /dev/pts
           
                    mkdir /dev/shm
           
                    # FALINUX
                    ## set getty console
                    CONSOLE=$(cmd_parsing console $CMDLINE)
                    if [ "$CONSOLE" = "" ]; then
                        ln -s /dev/ttyS0 /dev/ttyFC
                    else
                        IFS=","
                        set $CONSOLE
                        rm /dev/ttyFC > /dev/null 2>&1
                        ln -s /dev/$1 /dev/ttyFC
                    fi 
                    ;; 
                stop)
                    ;; 
                reload)
                    udevcontrol --reload_rules
                    ;; 
                *) 
                    echo "Usage: /etc/rc.d/init.d/udev {start|stop|reload}"
                            echo
                            exit 1
                            ;;
                    esac
                   
                    exit 0
                   
                   
        6.1.2 런레벨 따른 실행 링크 만들기
       
        etc/inittab 파일을 보시면 런레벨이 3으로 되어 있습니다.

        따라서 아래의 rc3.d 디렉토리에서 위에서 작성한 /etc/rc.d/init.d/udev 파일을 link 하면 됩니다.
         
        [root@falinux etc/rc.d/rc3.d] ls           
        S05syslog  S50inet
                   
        [root@falinux etc/rc.d/rc3.d] ln -s ../init.d/udev S70udev
                   
       
    6.2. udev 파일들 확인하기
   
        /sbin 디렉토리에서 udev 관련 파일들을 확인 합니다.
       
        root@tsheaven:sbin# ls -al udev*
       
        -rwxr-xr-x 1 root root 72935 2011-05-20 21:47 udevadm*
        lrwxrwxrwx 1 root root     7 2011-05-20 22:00 udevcontrol -> udevadm*
        -rwxr-xr-x 1 root root 65063 2011-05-20 21:47 udevd*
        lrwxrwxrwx 1 root root     7 2011-05-20 21:47 udevsettle -> udevadm*
        lrwxrwxrwx 1 root root     7 2011-05-20 22:00 udevtrigger -> udevadm*
                           
        여기서 udevcontrol, udevtrigger 파일이 없다면 다음과 같이 link 를 해 줘야 합니다.
       
        root@tsheaven:sbin# ln -s udevadm udevcontrol
        root@tsheaven:sbin# ln -s udevadm udevtrigger
                           
       
7. 커널에서 작업할일

    타겟보드가 부팅 후 로그인을 하기 위헤서는 램디스크파일시스템의 /etc/inittab 파일에 보시면
    아래와 같이 /sbin/getty 부분을 확인 할 수 있습니다. 
       
    T0:12345:respawn:/sbin/getty -L ttySAC0 115200 vt100

     
    위의 내용은 로그인시 ttySAC0 시리얼 장치를 통하여 메세지를 표출하는 것을 의미합니다.
    따라서 udev가 실행되어 장치파일을 만들 경우 ttySAC0 장치 파일 이름으로 생성되어야 합니다.
    하지만 현재 에프에이리눅스에서 제공되는 S3C6410 커널에서는 이 이름을 사용하지 않아서 커널에서 수정을 해 주어야 합니다.

    7.1 커널에서 수정할 내용
       
        root@tsheaven:linux-2.6.29# vi drivers/serial/samsung.c
       
        827        static struct uart_driver s3c24xx_uart_drv = {
        828            .owner      = THIS_MODULE,
        829            .dev_name   = "s3c2410_serial",
        830            .nr     = CONFIG_SERIAL_SAMSUNG_UARTS,
        831            .cons       = S3C24XX_SERIAL_CONSOLE,
        832            .driver_name    = S3C24XX_SERIAL_NAME,
        833            .major      = S3C24XX_SERIAL_MAJOR,
        834            .minor      = S3C24XX_SERIAL_MINOR,
        835        };

        에서 .dev_name 을 수정합니다.      
       
        827        static struct uart_driver s3c24xx_uart_drv = {
        828            .owner      = THIS_MODULE,
        829            .dev_name   = "ttySAC",
        830            .nr     = CONFIG_SERIAL_SAMSUNG_UARTS,
        831            .cons       = S3C24XX_SERIAL_CONSOLE,
        832            .driver_name    = S3C24XX_SERIAL_NAME,
        833            .major      = S3C24XX_SERIAL_MAJOR,
        834            .minor      = S3C24XX_SERIAL_MINOR,
        835        };
       
          
    7.2 커널 부팅 메세지에서 확인 하기
   
    fb4: s3cfb frame buffer device
    s3c6400-uart.0: s3c2410_serial0 at MMIO 0x7f005000 (irq = 16) is a S3C6400/10
    s3c6400-uart.1: s3c2410_serial1 at MMIO 0x7f005400 (irq = 20) is a S3C6400/10
    s3c6400-uart.2: s3c2410_serial2 at MMIO 0x7f005800 (irq = 24) is a S3C6400/10
    s3c6400-uart.3: s3c2410_serial3 at MMIO 0x7f005c00 (irq = 28) is a S3C6400/10
    brd: module loaded

    의 s3c2410_serial0 부분들이 아래와 같이 변경되면 정상적인 것입니다.
   
    fb4: s3cfb frame buffer device
    s3c6400-uart.0: ttySAC0 at MMIO 0x7f005000 (irq = 16) is a S3C6400/10
    s3c6400-uart.1: ttySAC1 at MMIO 0x7f005400 (irq = 20) is a S3C6400/10
    s3c6400-uart.2: ttySAC2 at MMIO 0x7f005800 (irq = 24) is a S3C6400/10
    s3c6400-uart.3: ttySAC3 at MMIO 0x7f005c00 (irq = 28) is a S3C6400/10
    brd: module loaded
 

 

    7.3 커널에서 .config 파일 확인 하기
  
           CONFIG_HOTPLUG=y
           CONFIG_UEVENT_HELPER_PATH=""
           CONFIG_NET=y
           CONFIG_UNIX=y
           CONFIG_SYSFS=y
           CONFIG_SYSFS_DEPRECATED*=n
           CONFIG_PROC_FS=y
           CONFIG_TMPFS=y
           CONFIG_INOTIFY_USER=y
           CONFIG_SIGNALFD=y
           CONFIG_TMPFS_POSIX_ACL=y (user ACLs for device nodes)
           CONFIG_BLK_DEV_BSG=y (SCSI devices)
  

       
8. 마무리

     램디스크 및 커널이 작업을 모두 마쳤다면 커널이미지와 램디스크이미지를 타겟보드에 다운로드를 하면 됩니다.

    이후 각자의 환경에 맞게 /etc/udev/rules.d 디렉토리에 있는 rules 파일들을 추가 또는 수정하면 됩니다.

 

****

/etc/rc.d/init.d/udev 파일을 첨부합니다.