Uboot 버전을 커널에서 확인하라고 한다. 기존에는 하나의 u-boot를 쓰다가, 하드웨어 관련 이슈 해결 방법으로 이것저것 손대다보니 u-boot까지 건드리게 되었고, 뭐.. 어쨋거나 Uboot 버전을 커널에서 확인하는 방법 우선, imx8m-mini 기반에서 uboot 버전을 확인하는 방법 3가지를 기술한다. 

     

    스크린샷은 생략 하기로 하고 ...

     

    우선 부트로더 버전을 설정 해야 한다.  특별히 설정하지 않았다면, 부트로더 옵션에서 설정해주면 된다. 

     

    0. 부트로더 버전 설정

      부트로더 버전 설정하는 위치는 아래와 같다. 

    부트로더 로컬버전 설정하는 위치이다.

     

    그리고 빌드하면, 다음과 같이 부트로더 버전이 다음과 같이 표시된다. 

    앞서 설정했던 부트로더 버전이 표시된다.

     

    자 그러면 i.MX8M-Mini의 파티션 설명을 해야되니 예를들면 아래와 같다. 

        <MBR>  

        <RAW>  ~ 20MByte : SPL, ATF, U-BOOT가 RAW 영역에 기록되며, ENV 영역도 여기에 포함된다.

                                    (imx-boot-sd.bin)

        <EXT4>  20MByte ~ 1G Byte : kernel 영역이다. 커널, DTB등 커널과 관련된 파티션이다.

        <EXT4>  1G Byte ~ rootfs를 구성하는 이것저것 들이 위치한다.

     

     

    1. 첫번째 방법 / Use the boot environment storage area. 

      앞서 준비단계(0)과 같이 진행 되었다면 부트로더 커맨드 모드에 진입하여 pri 명령으로 확인해보면 환경변수 ver가 표시 되는것을 확인할 수 있다.  그 상태에서 saveenv 명령을 입력하면 emmc의 ENV 영역에 환경변수가 업데이트 된다. 이후 부트로더 도구의 fw_printenv 명령을 통해서 ver을 출력하면 버전 이 표시된다.

     

    아래는 부트로더 커맨드 모드에서 ver 환경변수를 확인하는 방법이다. 

    u-boot=> pri ver
    ver=U-Boot 2018.03-imx8mm-1.1.0 (Feb 07 2022 - 20:35:57 +0900)

     

    부팅이 정상적으로 마치고 커널의 쉘에서 아래와 같이 확인하면 된다. 

    [root@imx ~]$ fw_printenv ver

    U-Boot SPL 2018.03-imx8mm-1.1.0 (Feb 07 2022 - 18:33:18 +0900)

     

    앞에서 saveenv를 해준 이유는, ver에 포함된 문자열은 부트로더 이미지에 포함되어있기 때문에 부팅될 때 메모리에 로드된다. 하지만 부트로더가 종료되고 커널이 부팅되면 부트로더가 사용하던 메모리는 커널이 사용하게 되므로 해당 메모리의 내용이 사라지기 때문에 uboot에서 saveenv를 입력하여 emmc의 ENV의 환경변수 영역에 기록해 준것이다. 

     

     

    2. 두번째 방법 / Using boot arguments

      만약 ENV 영역을 이용할 수 없는 경우라면, 어떻게 커널에게 부트로더 정보를 전달할 수 있을까? 부트로더가 부팅할 때 커널에게 전달하기 위한 파라메터인 bootarg를 이용한다. 부트로더 소스코드에서 원하는 부트 어규먼트 필자의 경우 mmc를 이용하기 때문에 mmcargs에서 참조 되거나 또는 포함되는 bootargs가 있다면 맨 마지막에 ${ver}을 포함해준다. 

     

    부트로더에서 확인해보니 아래와 같다. 

       u-boot=> pri mmcargs
       mmcargs=setenv bootargs ${jh_clk} console=${console} root=/dev/mmcblk${mmcblk}p${mmcpart} rootwait

       rw ${cma_size}

     

    위의 설정을 다음과 같이 바꾼다.

        u-boot=> setenv mmcargs 'setenv bootargs ${jh_clk} console=${console} root=/dev/mmcblk${mmcblk}p

        ${mmcpart} rootwait rw ${cma_size} ver=${ver}'

     

    그리고 saveenv를 입력해서 저장한다. 

        u-boot> saveenv

     

    다음은 정상 부팅후 커널에서 /proc/cmdline을 읽어보면, 부트로더 버전이 전달 된 것을 확인할 수 있다.

        [root@imx ~]$ cat /proc/cmdline

    bootargs를 이용하여 환경변수 전달

     

     아래와 같이 awk를 사용하면 원하는 부분만 잘라서 읽을 수 있다. 확인작업 몇번 했더니 버전 문자열이 자꾸 달라지고 있지만 개의치 말기 바란다.

        [root@imx ~]$ cat /proc/cmdline | awk '{ print $7 $8 }'

        U-Boot 2018.03

     

     

    3. 저장장치에서 직접 읽기 / Reading from the bootloader area of the storage device. 

    그런데 문제가 있다. saveenv를 사용하면 안되는경우, 뭐 여러경우가 있을 수 있는데, 필자의 경우도 이런 말되 안되는 경우에 해당 되었다. 그래서 emmc의 bootloader 영역에서 직접 긁어오는 방법을 이용하였다. 

     

        [root@imx ~]$ grep -a --null-data U-Boot /dev/mmcblk2 | head -2 | tail -1
        U-Boot SPL 2018.03 (Feb 07 2022 - 20:35:57 +0900)

    저장장치를 긁어서 버전확인

     

    각가지 다 장점과 단점을 가지고 있지만 어쩔수 없다면...

     

    가능한 방법을 사용하는게 정신건강에 좋다. 

     

    부트로더 버전확인 ... 끝..

    반응형
    • 네이버 블러그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기