티스토리 뷰

전자회로/임베디드교육

7주차

쥬브62 2020. 5. 18. 18:00

- $ uname -a // system 정보를 출력한다

 

- https://kernelnewbies.org/LinuxVersions //리눅스 버전별로 정리되어 있다

 

- bsp(board support package)

ex) 1. 삼성에서 s2c2450 cpu를 개발

2. cpu의 테스트를 위해 evaluation board를 만듬

 

- G2450_kernel을 samba에 옮겨서 실습 진행

 

### toolchain 만들기

0. http://crosstool-ng.org 에서 crosstool-ng를 다운로드

1. $ cd /work/G2450_kernel/06_class/toolchain

1-1. $ tar xfj crosstool-ng-1.16.0.tar.bz2

2. $ sudo apt-get install autoconf automake libtool libexpat1-dev libncurses5-dev bison flex patch curl cvs texinfo build-essential subversion gawk python-dev gperf //필요한 패키지 설치

3. $ cd crosstool-ng-1.16.0

4. $ ./configure //적용하고

5. $ make //build 함

6. $ make install

7. $ cd //홈디렉토리로 이동

8. $ mkdir src // 소스가 위치할 디렉토리

9. $ mkdir x-tools // 툴체인이 생성될 디렉토리

10. $ cd x-tools

11. $ ct-ng arm-unknown-linux-gnueabi // 설정파일인 config파일을 생성하는 명령어

12. $ ct-ng menuconfig //옵션 설정

12-1. Paths and misc options ->

Local tarballs directory //패키지가 다운되는 디렉토리, 일종의 재료, ~/src

Working directory //작업이 진행되는 디렉토리, 로그파일이 담김, .build

Prefix directory //Toolchain이 설치되는 디렉토리, 결과물, ~/x-tools

12-2. Toolchain options ->

Tuple's vendor string // none으로 변경

12-3. C compiler ->

gcc version // 4.4.1로 변경(mds2450에 맞게)

Fortran, Java 제거

12-4. Debug facilities ->

duma, strace 제거

12-5. Conpanion libraries ->

PPL version // 0.10.2로 변경(gcc 4.4.1에 필요함)

13. cd ~/x-tools

13-1. ct-ng build

13-2. 오류나면 vim /work/G2450_kernel/06_class/toolchain/crosstool-ng-1.16.0/scripts/build/kernel/linux.sh 수정해야 함

주소변경이 필요함

 

14. $ mkdir /opt/arm-mds

15. $ cp -r arm-none-linux-gnueabi/* /opt/arm-mds/

16. $ vim ~/.bashrc

 

17. $ . ~/.bashrc //환경 다시 불러오기

18. $ arm-none-linux-gnueabi-gcc -v // gcc version 4.4.1 (crosstool-NG 1.16.0) 확인

 

- MDS2450 BSP 구성요소

1. 부트로더 소스코드 및 이미지 파일

2. 리눅스 커널소스, 디바이스 드라이버 소스 및 이미지 파일

3. 램디스크 이미지 파일

4. GCC

5. 사용 설명서

 

- #!/bin/sh -e //문서내에 있다면 쉘로 실행해라는 뜻

 

- 포팅 : 다른 환경에서 실행 될 수 있게 만드는 작업

(교재 : 7. 리눅스 커널 포팅 84p)

###보드포팅

#u-boot 포팅

1. 유사보드의 선택

$cd /work/G2450_kernel/06_class/bootloader

$ tar xjf u-boot-1.3.4.tar.bz2

$ tar xjf s3c-u-boot-1.1.6_rel-4-3-0_20080530.tar.bz2

$ cd /work/G2450_kernel/06_class/bootloader/s3c-u-boot-1.1.6/

$ vim Makefile //smdk2450용 부트로더 수정

arm-none-linux-gnueabi- 로 변경

161번줄 주석처리

 

$ make clobber

$ make smdk2450_config

$ make

 

2. Makefile 수정

$ cd /work/G2450_kernel/06_class/bootloader/u-boot-1.3.4

$ vim Makefile

arm-none-linux-gnueabi- 로 변경

 

위의 내용을 추가해 줌

 

3. 보드 디렉터리 추가

$ cd /work/G2450_kernel/06_class/bootloader/u-boot-1.3.4/board

$ mkdir mds

$ mkdir mds/mds2450

$ cd /work/G2450_kernel/06_class/bootloader/s3c-u-boot-1.1.6/board/samsung/smdk2450

$ cp -r * /work/G2450_kernel/06_class/bootloader/u-boot-1.3.4/board/mds/mds2450

$ cd/work/G2450_kernel/06_class/bootloader/s3c-u-boot-1.1.6/board/samsung/common

$ cp -r */work/G2450_kernel/06_class/bootloader/u-boot-1.3.4/board/mds

 

4. board 파일과 Makefile

$ cd /work/G2450_kernel/06_class/bootloader/u-boot-1.3.4/board/mds/mds2450

$ mv smdk2450.c mds2450.c

$ vi Makefile

- smdk2450.o -> mds2450.o 변경

 

5. 헤더복사

$ cd /work/G2450_kernel/06_class/bootloader

$ cp s3c-u-boot-1.1.6/include/s3c2450.h u-boot-1.3.4/include/

$ cp -r s3c-u-boot-1.1.6/include/asm-arm/arch-s3c24xx u-boot-1.3.4/include/asm-arm/

 

6. 소스 코드 디렉토리 복사

$ cd /work/G2450_kernel/06_class/bootloader

$ cp -r s3c-u-boot-1.1.6/cpu/s3c24xx/ u-boot-1.3.4/cpu/

 

7. mds2450 nand관련 파일 복사

$ cd /work/G2450_kernel/06_class/bootloader

$ cp s3c-u-boot-1.1.6/drivers/nand/nand_base.c u-boot-1.3.4/drivers/mtd/nand/ //관련파일

$cp s3c-u-boot-1.1.6/drivers/nand/nand_bbt.c u-boot-1.3.4/drivers/mtd/nand/

$cp s3c-u-boot-1.1.6/drivers/nand/nand_ids.c u-boot-1.3.4/drivers/mtd/nand/

$cp s3c-u-boot-1.1.6/drivers/nand/nand_ecc.c u-boot-1.3.4/drivers/mtd/nand/

$ cp s3c-u-boot-1.1.6/include/linux/mtd/nand.h u-boot-1.3.4/include/linux/mtd/ //헤더파일

$ cp s3c-u-boot-1.1.6/include/linux/mtd/mtd.h u-boot-1.3.4/include/linux/mtd/

$ cp s3c-u-boot-1.1.6/include/linux/mtd/mtd-abi.h u-boot-1.3.4/include/linux/mtd/

 

8. 보드에 대한 타입(machine type)을 추가

초기화 과정동안 커널이 지원가능 한 보드인지 확인하기 위해서

$ cd /work/G2450_kernel/06_class/bootloader/u-boot-1.3.4/include/asm-arm/

$ vi mach-types.h

- 위의 내용을 추가해야 함, 3495는 MDS2450의 고유 번호

 

9. 타깃 보드의 설정파일을 복사

$ cd /work/G2450_kernel/06_class/bootloader

$ cp s3c-u-boot-1.1.6/include/configs/smdk2450.h u-boot-1.3.4/include/configs/mds2450.h

 

10. 헤더파일 수정

$cd /work/G2450_kernel/06_class/bootloader
$ vi u-boot-1.3.4/include/configs/mds2450.h

- #include <config_cmd_default.h> 로 수정

 

- CONFIG_SERIAL2로 수정

 

- 62라인에 추가

 

11. 링크를 위해 mkconfig 수정

$ cd /work/G2450_kernel/06_class/bootloader/u-boot-1.3.4

$ vi mkconfig

- 위의 내용을 추가

 

12. Makefile 수정

$ cd /work/G2450_kernel/06_class/bootloader/u-boot-1.3.4/cpu/s3c24xx/
$ vi Makefile

- 이렇게 수정

 

13. main.c 수정

$ cd /work/G2450_kernel/06_class/bootloader/u-boot-1.3.4/common

$ vi main.c

 

:%s/inline/ /gc //vi에서 51번 inline을 제거

 

14. board.c 수정

$ cd /work/G2450_kernel/06_class/bootloader/u-boot-1.3.4/lib_arm
$ vi board.c

- :%s/inline/ /gc 로 수정

 

- 384라인 제거

 

15. u-boot.lds 수정

$ cd /work/G2450_kernel/06_class/bootloader/u-boot-1.3.4/board/mds/mds2450

$ vi u-boot.lds

- 위에 처럼 수정

 

16. 변경된 config설정 적용

$ cd /work/G2450_kernel/06_class/bootloader/u-boot-1.3.4/drivers/mtd/nand

$ vi nand.c

 

$ vi nand_base.c

 

$ vi nand_bbt.c

 

$ vi nand_ids.c

 

$ vi nand_ecc.c

 

$ cd /work/G2450_kernel/06_class/bootloader/u-boot-1.3.4/cpu/s3c24xx

$ vi nand.c

 

$ cd /work/G2450_kernel/06_class/bootloader/u-boot-1.3.4/common

$ vi env_nand.c

 

17. s3c2450.h 수정

$ cd /work/G2450_kernel/06_class/bootloader/u-boot-1.3.4/include

$ vi s3c2450.h

- 위의 내용을 추가

 

18. lowlevel_init.S 수정

$ cd /work/G2450_kernel/06_class/bootloader/u-boot-1.3.4/board/mds/mds2450

$ vi lowlevel_init.S

- UART 1로 수정

 

19. 램 상에서 테스트하기

$ cd /work/G2450_kernel/06_class/bootloader/u-boot-1.3.4/board/mds/mds2450

$ vi config.mk

- 위의 내용으로 수정

 

$ cd /work/G2450_kernel/06_class/bootloader/u-boot-1.3.4

$ make clobber

$ make mds2450_config

$ make

### 커널 포팅 레이어 분석 및 포팅 (7-139p)

#압축해체

$ tar xzf linux-3.0.22.tar.gz

 

#Makefile 수정

$ cd /work/G2450_kernel/06_class/kernel/linux-3.0.22

$ vi Makefile //arm용으로 수정

 

#커널 포팅

$ make s3c2410_defconfig // s3c24x0 보드 설정로드

$ cd arch/arm/mach-s3c2416/

$ cp mach-smdk2416.c mach-mds2450.c // board파일 mds2450용 복사

$ vi mach-mds2450.c //struct 내용은 주석처리

 

$ :%s/smdk2416/mds2450/gc // 치환

- 이쪽도 수정해줘야 함

 

$ vi /work/G2450_kernel/06_class/kernel/linux-3.0.22/arch/arm/tools/mach-types

- arch number를 추가해 줌

 

$ vi /work/G2450_kernel/06_class/kernel/linux-3.0.22/arch/arm/plat-s3c24xx/Makefile

- mach-mds2450.c에서 필요한 함수를 컴파일시 포함하도록 옵션 수정

 

# 새 보드 추가하기

$ cd /work/G2450_kernel/06_class/kernel/linux-3.0.22/arch/arm/mach-s3c2416

$ vi Kconfig //커널 설정 메뉴에 새보드 추가하기

- 위의 내용처럼 추가제거

 

$ vi Makefile //보드 관련 초기화 파일 추가

- 위의 내용을 추가

 

#커널 옵션 설정

$ cd /work/G2450_kernel/06_class/kernel/linux-3.0.22/

$ make menuconfig //책 참고

 

#커널 빌드

$ make zImage

 

#커널 부트 테스트

$ cp arch/arm/boot/zImage /tftpboot

MDS2450# tftp c0008000 zImage;bootm c0008000 //부트로더에서 새로운 커널 이미지로드하고 부팅확인

 

 

###Network device 추가하기 (7-154p)

# LAN9220 칩

 

- 6번 랭크사용, physical address 0x28000_0000 ~ 0x3000_0000

- low일때 동작

- data bus를 16bit 사용

- IRQ 핀으로 EINT18 사용

 

# 매핑 주소 관련 정의 추가

$ cd /work/G2450_kernel/06_class/kernel/linux-3.0.22/arch/arm/mach-s3c2416

$ vi mach-mds2450.c //아래 구조체 3개와 헤더파일 추가

//22라인 쯤에 헤더파일 추가
#include <linux/smsc911x.h>


//208라인 쯤에 매핑주소 관련 정의 추가
static struct resource mds2450_smsc911x_resources[] = {
    [0] = {
            .start = S3C2410_CS5,
            .end   = S3C2410_CS5 + SZ_64K - 1,
            .flags = IORESOURCE_MEM,
    },
    [1] = {
            .start = IRQ_EINT18,
            .end   = IRQ_EINT18,
            .flags = IORESOURCE_IRQ | IRQ_TYPE_LEVEL_LOW,
    },
};


// data bust width 및 드라이버 리소스 등록
static struct smsc911x_platform_config mds2450_smsc911x_pdata = {
    .irq_polarity  = SMSC911X_IRQ_POLARITY_ACTIVE_LOW,
    .irq_type      = SMSC911X_IRQ_TYPE_PUSH_PULL,
    .flags         = SMSC911X_USE_16BIT | SMSC911X_FORCE_INTERNAL_PHY,
    .phy_interface = PHY_INTERFACE_MODE_MII,
    .mac           = {0x00, 0x80, 0x00, 0x23, 0x45, 0x67},
};

static struct platform_device mds2450_smsc911x = {
    .name          = "smsc911x",
    .id            = -1,
    .num_resources = ARRAY_SIZE(mds2450_smsc911x_resources),
    .resource      = &mds2450_smsc911x_resources[0],
    .dev = {
            .platform_data = &mds2450_smsc911x_pdata,
    },
};



//249라인 쯤에 드라이버 리소스 등록
&mds2450_smsc911x

 

#커널 옵션에서 네트워크 디바이스 드라이버 설정

$ cd /work/G2450_kernel/06_class/kernel/linux-3.0.22/

$ make menuconfig //책 참고

 

#커널 빌드

$ make zImage

 

#커널 부트 테스트

$ cp arch/arm/boot/zImage /tftpboot

MDS2450# tftp c0008000 zImage;bootm c0008000

 

### 루트 파일 시스템(roofs)

#기존 rootfs 백업

$ cd /nfs

$ cp -r rootfs rootfs.bak

 

#루트 파일 시스템 디렉터리 생성

$ vi /work/G2450_kernel/06_class/rootfs/mkrootfs //쉘스크립트 수정

 

$ ./mkrootfs

 

#라이브러리 설치

$ cd /nfs/rootfs_new

$ cp -a /nfs/rootfs.bak/lib ./ //백업해둔 lib를 그대로 사용

 

#환경변수 설치

$ cp -a /nfs/rootfs.bak/etc ./

 

### busybox (7-186p)

#busy box 설치

$ cd /work/G2450_kernel/06_class/rootfs/

$ tar xjf busybox-1.17.1.tar.bz2

$ cd busybox-1.17.1

$ make menuconfig // 책 참고

$ make

$ make install

$ cd _install

$ cp -a * /nfs/rootfs_new

 

###udev 설치(7-190p)

$ cd /work/G2450_kernel/06_class/rootfs

$ tar xjf udev-106.tar.bz2

$ cd udev-106

$ vi Makefile

 

$ make

$ make DESTDIR=/nfs/rootfs_new install // 그냥 make install하면 /etc/udev 에 덮어 쓸수가 있다.

$ cp udevstart /nfs/rootfs_new // udevstart가 복사가 안되서 수동으로 해주어야 함

 

# 디바이스 파일 생성

$ cd /nfs/rootfs_new/dev

$ mknod ./console c 5 1 // char형 5, 1번 부여

 

#루트 파일 시스템 테스트

MDS2450#

setenv bootargs 'root=/dev/nfs rw nfsroot=192.168.20.90:/nfs/rootfs ip=192.168.20.246:192.168.20.90:192.168.20.1:255.255.255.0::eth0:off console=ttySAC1,115200n81'

-> 이걸로 수정

setenv bootargs 'root=/dev/nfs rw nfsroot=192.168.20.90:/nfs/rootfs_new ip=192.168.20.246:192.168.20.90:192.168.20.1:255.255.255.0::eth0:off console=ttySAC1,115200n81'

MDS2450# save

MDS2450# reset

 

### Library 확장하기(7-194p)

# zlib 설치

$ cd /work/G2450_kernel/06_class/madplay

$ tar xfz zlib-1.2.2.tar.gz

$ cd zlib-1.2.2

 

$ CC=arm-none-linux-gnueabi-gcc LDSHARED="arm-none-linux-gnueabi-gcc -shared -W1,-soname,libz.so.1" ./configure --shared --prefix=_install    // configuration 적용

$ make; make install

 

$ cp -a ./_install/* /toolchain/arm-2010q1/arm-none-linux-gnueabi/.    //헤더파일하고 라이브러리 복사

$ cp -a ./_install/* /nfs/rootfs_new/usr/.

$ cd /nfs/rootfs_new/usr/lib

$ ls -l libz.*

 

# Mad library 설치

$ cd /work/G2450_kernel/06_class/madplay

$ tar xfz libmad-0.15.1b.tar.gz

$ cd libmad-0.15.1b

$ CC=arm-none-linux-gnueabi-gcc LD=arm-none-linux-gnueabi-ld AR=arm-none-linux-gnueabi-ar RANLIB=arm-none-linux-gnueabi-ranlib ./configure --build=i386-linux --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi --enable-speed --enable-fpm=arm --enable-sso --prefix=/work/G2450_kernel/06_class/madplay/libmad-0.15.1b/_install    //configuration 적용

$ make

$ vi Makefile

 

$ make; make install

 

$ cp -rf _install/* /toolchain/arm-2010q1/arm-none-linux-gnueabi/.

$ cp -a _install/* /nfs/rootfs_new/usr/.

$ ls -al /nfs/rootfs_new/libmad*

 

#id3tag library 설치

$ cd /work/G2450_kernel/06_class/madplay

$ tar xfz libid3tag-0.15.1b.tar.gz

$ CC=arm-none-linux-gnueabi-gcc LD=arm-none-linux-gnueabi-ld AR=arm-none-linux-gnueabi-ar RANLIB=arm-none-linux-gnueabi-ranlib ./configure --build=i386-linux --host=arm-none-linux-gnueabi --target=arm-none-linux-gnueabi     --prefix=/work/G2450_kernel/06_class/madplay/libid3tag-0.15.1b/_install    //configuration 적용

$ make; make install

 

$ cp -a _install/* /toolchain/arm-2010q1/arm-none-linux-gnueabi/.

$ cp -a _install/* /nfs/rootfs_new/usr/.

$ ls -l /nfs/rootfs_new/usr/lib/libid*

 

#추가된 라이브러리 사용

$ arm-none-linux-gnueabi-gcc -o test test.c -lmad

 

 

###응용 프로그램 설치(7-200p)

#Mad player 설치

$ cd work/G2450_kernel/06_class/madplay/

$ tar xfz madplay-0.15.2b.tar.gz

$ cd madplay-0.15.2b

$ ./configure --build=i386-linux --host=arm-none-linux-gnueabi target=arm-none-linux-gnueabi-gnu CPPFLAGS="-I/toolchain/arm-2010q1/arm-none-linux-gnueabi/include" LDFLAGS="-L/toolchain/arm-2010q1/arm-none-linux-gnueabi/lib" --prefix=/work/G2450_kernel/06_class/madplay/madplay-0.15.2b/_install

$ make; make install

$ cp -a _install/bin/* /nfs/rootfs_new/bin/.

 

$ cd /work/G2450_kernel/06_class/madplay

$ cp StayWithMe.mp3 /nfs/rootfs_new/root/.

 

MDS2450 : cd /root

MDS2450 : madplay StayWithMe.mp3

 

 

### 루트파일 시스템 최적화 (7-217p)

$ cd /nfs/rootfs_new

$ du -h  //용량 확인

$ cd ..

$ cp -a rootfs_new rootfs.orig //백업

 

$ cd /nfs/rootfs_new/bin

$ ls -l madplay

$ size madplay 

$ arm-none-linux-gnueabi-strip madplay   // symbol 및 debug 정보 제거

$ ls -l madplay

 

$ cd /nfs

$ mv rootfs_new rootfs_new.pack  //패키징시에 사용하려고 백업

$ mv rootfs.orig rootfs_new  //다시 복구

 

 

### 램디스크를 이용한 패키징 제작(7-220p)

#램디스크로 사용할 파일생성

$ cd

$ mkdir ramdis

$ cd ramdisk

$ dd if=/dev/zero of=ramdisk-mds2450 bs=1k count=32768  // dev/zero를 input으로 받아 변환해서 ramdisk-mds2450으로 만듬

 

#파일시스템 생성

$ mke2fs ramdisk-mds2450   // ext2 파일시스템으로 포맷

 

#램디스크 이미지 마운트

$ mkdir mnt_ramdisk

$ mount -t ext2 -o loop ramdisk-mds2450 mnt_ramdisk/    //마운트

$ cd mnt_ramdisk

 

#루트 파일 시스템 복사

$ cp -a /nfs/rootfs_new.pack/* ./

$ cd ..

$ umount mnt_ramdisk   // 마운트 해제

$ gzip -vf9 ramdisk-mds2450   //gzip으로 압축

$ cp ramdisk-mds2450.gz /tftpboot

 

#커널 옵션 설정

$ cd /work/G2450_kernel/06_class/kernel/linux-3.0.22

$ make menuconfig  // 책참고

 

# 커널빌드 및 패키징

$ make zImage  

$ cp arch/arm/boot/zImage /tftpboot

 

MDS2450# tftpboot 32000000 zImage // 커널 다운로드

MDS2450# nand erase 00080000 00500000

MDS2450# nand write 32000000 00080000 00500000

 

MDS2450# tftpboot 30800000 ramdisk-mds2450.gz  // 램디스크를 다운로드

MDS2450# nand erase 00600000 02000000

MDS2450# nand write 30800000 00600000 02000000

 

MDS2450# setenv bootargs 'initrd=0x30800000,16M ramdisk=32768 root=/dev/ram rw init=/linuxrc console=ttySAC1,115200n81'      //부트 옵션 설정

MDS2450# setenv bootcmd 'nand read 32000000 00080000 00500000;nand read 30800000 00600000 02000000;bootm 32000000'     // boot command설정

MDS2450# save 

MDS2450# reset 

 

 

### YAFFS2를 이용한 패키징 제작(7-225p)

# NAND/MTD 드라이버 추가를 위한 헤더파일을 추가

$ vi /work/G2450_kernel/06_class/kernel/linux-3.0.22/arch/arm/mach-s3c2416/mach-mds2450.c

- 3줄 추가

 

# 정적 파티션 나누기 - MDS2450용 파티션 테이블 추가

/* NAND parititon */
static struct mtd_partition mds2450_default_nand_part[] = {
        [0] = {
                .name           = "Bootloader",
                .offset         = 0,
                .size           = (512*SZ_1K),
        //        .mask_flags     = MTD_CAP_NANDFLASH,
        },
        [1] = {
                .name           = "Kernel",
                .offset         = (512*SZ_1K),    /* Block number is 0x10 */
                .size           = (5*SZ_1M) - (512*SZ_1K),
        //        .mask_flags     = MTD_CAP_NANDFLASH,
        },
        [2] = {
                .name           = "rootfs",
                .offset         = MTDPART_OFS_APPEND,
                .size           = MTDPART_SIZ_FULL,
        },
};

- 141라인에 추가했음

 

 

# NAND 파티션 정보 및 타이밍 설정

static struct s3c2410_nand_set mds2450_nand_sets[] = {
    [0] = {
            .name           = "NAND",
            .nr_chips       = 1,
            .nr_partitions  = ARRAY_SIZE(mds2450_default_nand_part),
            .partitions     = mds2450_default_nand_part,
    },
};

/* choose a set of timings which should suit most 512Mbit
 * chips and beyond.
*/

static struct s3c2410_platform_nand mds2450_nand_info = {
    .tacls          = 20,
    .twrph0         = 40,
    .twrph1         = 20,
    .nr_sets        = ARRAY_SIZE(mds2450_nand_sets),
    .sets           = mds2450_nand_sets,
};

- 161라인에 추가했음

 

 

#커널에 등록할 리소스 추가

 

- 추가

 

- smdk2416용 초기화 함수는 주석처리

 

 

# 드라이버 리소스 등록

-추가

 

 

# 커널 옵션 설정

- s3c_nand.c 를 /work/G2450_kernel/06_class/kernel/linux-3.0.22/drivers/mtd/nand 에 옮긴다

$ cd /work/G2450_kernel/06_class/kernel/linux-3.0.22/drivers/mtd/nand

$ vi Kconfig   //menuconfig에 NAND 드라이버 추가

config MTD_NAND_S3C
    tristate "NAND Flash support for S3C SoC"
    depends on ARCH_S3C2410 && MTD_NAND
    help
      This enables the NAND flash controller on the S3C.

      No board specfic support is done by this driver, each board
      must advertise a platform_device for the driver to attach.

config MTD_NAND_S3C_DEBUG
    bool "S3C NAND driver debug"
    depends on MTD_NAND_S3C
    help
      Enable debugging of the S3C NAND driver

config MTD_NAND_S3C_HWECC
    bool "S3C NAND Hardware ECC"
    depends on MTD_NAND_S3C
    help
      Enable the use of the S3C's internal ECC generator when
      using NAND. Early versions of the chip have had problems with
      incorrect ECC generation, and if using these, the default of
      software ECC is preferable.

      If you lay down a device with the hardware ECC, then you will
      currently not be able to switch to software, as there is no
      implementation for ECC method used by the S3C 

- 193라인에 추가

 

$ vi Makefile

- 추가함

 

$ cd /work/G2450_kernel/06_class/kernel/linux-3.0.22

$ make menuconfig   // 책 참고

 

 

# YAFFS2 커널패치

$ cd /work/G2450_kernel/06_class/yaffs2

$ tar xf yaffs2_patch.tar

$ ./patch-ker.sh c m ../../kernel/linux-3.0.22  //현재 사용중인 커널 소스가 있는 디렉터리에 yaffs를 사용할 수 있게 세티해주는 쉘스크립트, yaffs2 디렉토리가 생김

 

 

# 커널 옵션 설정

$ cd /work/G2450_kernel/06_class/kernel/linux-3.0.22

$ make menuconfig  // 책 참고

 

 

#커널빌드

$ make zImage

$ cp arch/arm/boot/zImage /tftpboot/zImage

 

 

#루트 파일 시스템 압축

$ cd /nfs/rootfs_new.pack   // 루트파일시스템 최적화 해 둔것

$ tar cf rootfs.tar *   // 디렉토리 내 모든 파일을 하나로 모음

$ cp rootfs.tar ../rootfs    // 압축한 이미지를 NFS로 마운트 할 루트파일시스템으로 복사

 

 

#커널이미지 로드

MDS2450# tftpboot 32000000 zImage

MDS2450# setenv bootargs 'root=/dev/nfs rw nfsroot=192.168.20.90:/nfs/rootfs ip=192.168.20.246:192.168.20.90:192.168.20.1:255.255.255.0::eth0:off console=ttySAC1,115200n81'   //램디스크 때문에 변경했던거 원래대로

MDS2450# setenv bootcmd 'tftp 32000000 zImage;bootm 32000000'

MDS2450# save

MDS2450# reset

root@MDS2450:~# cat proc/mtd    //MTD 파티션 확인

 

 

#커널이미지 로드

MDS2450# tftpboot c0008000 zImage

MDS2450# nand erase 80000 500000

MDS2450# nand write c0008000 80000 500000 //c0008000에 80000~500000 크기만큼

 

 

#부트옵션 설정

MDS2450# setenv bootargs 'root=/dev/nfs rw nfsroot=192.168.20.90:/nfs/rootfs ip=192.168.20.246:192.168.20.90:192.168.20.1:255.255.255.0::eth0:off console=ttySAC1,115200n81'  

MDS2450# setenv bootcmd 'nand read c0008000 00080000 00500000;bootm c0008000'

MDS2450# save

MDS2450# reset

 

 

# mtd2 파티션을 YAFFS2로 마운트

root@MDS2450:~# mount -t yaffs2 /dev/mtdblock2 /mnt

 

# 마운트 된 디렉터리에 압축된 루트파일 시스템 해제

root@MDS2450:~# cd /

root@MDS2450:~# tar xf rootfs.tar -C /mnt

root@MDS2450:~# ls /mnt/

root@MDS2450:~# umount /mnt

 

재부팅하고

 

#부트옵션 설정

MDS2450# setenv bootargs 'root=/dev/mtdblock2 rw rootfstype=yaffs2 console=ttySAC1,115200n81'

# boot command 설정

MDS2450# setenv bootcmd 'nand read c0008000 00080000 00500000;bootm c0008000'

MDS2450# save

MDS2450# reset

 

# 확인

root@MDS2450:~# cd /dev/

root@MDS2450:~# ls -l mtd*   //9개의 정보가 나옴

'전자회로 > 임베디드교육' 카테고리의 다른 글

8주차  (0) 2020.05.25
6  (0) 2020.05.11
5  (0) 2020.05.04
4  (0) 2020.04.27
MMU(memory management unit) -수정중  (0) 2020.04.21
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함