ABOUT ME

  • 부트로더 응용 실습
    Linux/UDOO board 2020. 7. 20. 21:46
    반응형

    타겟 보드 : UDOO

     

    본 예제는 기본적인 부트 로드를 구성한 후의 실습입니다. 

    부트 로드 설치 및 설정은 아래의 포스팅을 참고 해 주세요!

     

     

    https://garage-fullof-dummy.tistory.com/34

     

    UDOO 부트로더(Bootloader) 빌드

    | 부트로더 디렉토리 생성 부트로더 파일을 위한 디렉토리를 만든다 명령어 : cd udoo_linux_bsp/ mkdir u-boot ; cd u-boot samba를 이용해서 가져온 파일을 현재 디렉토리에 복사한다 명령어 : cp /srv/samba/..

    garage-fullof-dummy.tistory.com

     

     

    1) 작업하는 컴퓨터의 부트로더가 설치된 곳으로 파일 경로를 이동해준다

     

    명령어 : cd  emblinux/udoo_linux_bsp/u-boot/uboot-imx-2015.10.fslc-qdl

     

     

     

     

    2)부트로더에 올려줄 코드를 c를 이용해서 작성해 준다

     

    명령어 : vi common/cmd_kcci_led.c

     

     

     

     

    #include <common.h>
    #include <command.h>
    #include <asm/io.h>
    #define IOMUXC_SW_MUX_CTL_PAD_SD1_DATA0 0x0200E0340 //GPIO_16
    #define IOMUXC_SW_MUX_CTL_PAD_SD1_DATA1 0x020E033C //GPIO1_17
    #define IOMUXC_SW_MUX_CTL_PAD_SD1_CMD 0x00E0348 //GPIO1_18
    #define IOMUXC_SW_MUX_CTL_PAD_SD1_DATA2 0x020E034C //GPIO1_19
    #define GPIO1_DR 0x0209C000
    #define GPIO1_GDIR 0x0209C004
    #define GPIO1_PSR 0x0209C008
    void led_init(void)
    {
    unsigned long temp;
    temp =0x05; //Select signal GPIO
    writel(temp,IOMUXC_SW_MUX_CTL_PAD_SD1_DATA0); //GPIO1_16
    writel(temp,IOMUXC_SW_MUX_CTL_PAD_SD1_DATA1); //GPIO1_17
    writel(temp,IOMUXC_SW_MUX_CTL_PAD_SD1_CMD); //GPIO1_18
    writel(temp,IOMUXC_SW_MUX_CTL_PAD_SD1_DATA2); //GPIO1_19
    temp = 0x0f <<16; //GPIO1_IO16~IO19 Direction : Output
    temp =readl(GPIO1_GDIR) |temp;
    writel(temp, GPIO1_GDIR);
    temp = ~(0x0f <<16); //LED1~4 : Off
    temp = readl(GPIO1_DR) &temp;
    writel(temp,GPIO1_DR);
    }
    void led_write(unsigned long led_data)
    {
    led_data = led_data <<16;
    writel(led_data, GPIO1_DR);
    }
    unsigned long led_read(void)
    {
    unsigned long temp;
    temp = (readl(GPIO1_DR)>>16) & 0x0f;
    return temp;
    }
    static int do_KCCI_LED(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
    {
    unsigned long led_data;
    if(argc !=2)
    {
    cmd_usage(cmdtp);
    return 1;
    }
    printf("*LED TEST START(작성자:KSH)\n");
    led_init();
    led_data=simple_strtoul(argv[1],NULL,16);
    led_write(led_data);
    led_data = led_read();
    printf("*LED TEST END(%s : %#04x)\n\n ",argv[0],(unsigned int)led_data);
    return 0;
    }
    U_BOOT_CMD(
    led,2,0,do_KCCI_LED,
    "led - kcci LED Test",
    "number - Input argument is only one.(led [0x00~0x0f])\n");
    view raw kcci_led.c hosted with ❤ by GitHub

    간단한 코드 리뷰

     

     

     

     

    3) Makefile할 때 같이 컴파일 되도록 써준다

     

    명령어 : vi common/Makefile

     

    **** Makefile이 여러개 있으니까 경로에 주의!!!

     

     

    10행에 부트 로더에 올릴 파일의 오브젝트 명을 추가해준다

     

     

     

     

     

    4) 타겟보드에 올릴것이기 때문에 arm용 컴파일을 해준다 

     

    명령어 : ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make

     

     

     

     

     

     

     

    6) 컴파일로 생성된 u-boot.img 파일을 타겟보드로 nfs를 이용하여 옮겨준다(scp를 이용하는 방법도 있다!)

     

    명령어 : cp u-boot.img /srv/nfs

    명령어 : scp u-boot.img udooer@192.168.1.101:~                          (scp를 이용하는 경우!)

     

     

     

    7) 타겟 보드 터미널에서 sd카드를 퓨징한다

     

    명령어 : sudo dd if=u-boot.img of=/dev/mmcblk0 bs=1K seek=69

     

     

     

    8)  타겟보드를 재부팅해서 부트커멘드 모드로 진입한다

     

     

     

    위의 사진같이 나오면 잽싸게 3...2...1.. 이내에 아무 키나 눌러서 커멘드 모드로 들어가 준다

    놓쳤다면....재부팅 ^^*

     

     

     

    9) 코드로 작성했던 명령어를 입력해서 led를 켠다

     

     

    led 0x01  -> LED1

    led 0x02  -> LED2

    led 0x04  -> LED3

    led 0x08  -> LED4

    728x90

    'Linux > UDOO board' 카테고리의 다른 글

    UDOO 커널(Kernel) 빌드  (10) 2020.07.13
    UDOO 부트로더(Bootloader) 빌드  (0) 2020.07.13
    UDOO 파일시스템 빌드  (0) 2020.07.13
    UDOO board nfs 설치  (0) 2020.07.13
    UDOO board samba 설치  (0) 2020.07.13

    댓글

Designed by Tistory.