12/24/2020

i.MX mfgtools/uuu

1. SoC의 I.MX Series 의 Window/Linux Tool

UUU(Universal Update Utility) 약어로 NXP사의 i.MX Series를 처음 Download할 때 필요한 Tool이며, fastboot와 연결해주는 역할까지 해주는 것으로 파악된다.
UUU는 기본적으로 libusb를 사용하며, 별도의 driver가 필요없으며, Window에서 i.MX Series 찾을 경우 USB HID Interface로 인식한다.


  • MFGTools/ UUU Download 
uuu program 과 uuu.pdf manual download 
  https://github.com/NXPmicro/mfgtools/releases

  • 기본사용법 아래링크에서 확인
상위 release에서 제공하는 uuu.pdf manual을 참고 


1.1 UUU기반의 기본 Batch 파일생성 

uuu를 download 했으면, 기본적으로 매번 uuu로 명령어를 실행하기가 귀찮기 때문에 batch file or shell script로 이를 만들어 필요한 부분만을 
본인이 정하고 사용한다. 

  • Burn_eMMC.bat 파일 예제
아래와 같이 쉽게 Window에서 쉽게 batch file or shell script를 만들어서 실행가능 
소스르 간단히 분석하면 setESC는 Window에서 색을 표시하기 위해서 넣었다. 
동작은 아래와 같이 동작한다.
  1. uuu -lsusb : uuu에 연결된 USB Device Vendor/Product ID 확인 
  2. uuu -b emmc_all u-boot.imx core-image-imx6sxsabresd.sdcard.bz2/*: u-boot.imx로 boot 후 core-image-imx6sxsabresd.sdcard.bz2 안에 file들을 write eMMC에 wirte
  3. uuu FB: ucmd setenv ethaddr 26:E1:2C:C4:C7:C6 : uuu script로 uboot에게 명령어 전달
  4. uuu FB: ucmd setenv eth1addr c2:42:5a:9f:cd:09 : 상동
  5. uuu FB: ucmd saveenv: 상동 (uboot의 정보 저장)

@ECHO OFF
TITLE Jeonghun's i.MX6 Burn_eMMC.bat
rem  
rem  * Author:  Jeonghun Lee
rem  * Description: 
rem    - This batch file is used for burning a Image into eMMC
rem    
setlocal
call :setESC
echo %ESC%[1;31m 
ECHO ------------------------------------------------------------------------------------------------------
ECHO ---------------------------      CAUTION           ---------------------------------------------------
ECHO ------------------------------------------------------------------------------------------------------
echo %ESC%[0m
ECHO Ready to burn an image on eMMC in iMX6 board 
ECHO Please check your bootmode or usb connection on your board if not work properly
echo %ESC%[1;31m
ECHO *** Please check "Connected Known USB devices" below
ECHO.     
ECHO     Chip          Vid         Pid
ECHO     -------------------------------
ECHO                  0x0525    0xA4A5 
ECHO      MX6SX       0x15A2    0x0071 
echo %ESC%[0m
ECHO.
uuu -lsusb
ECHO.  
echo %ESC%[1;31m
ECHO *** Please check "Success 1" and "Done" below after writing the Image  
echo %ESC%[0m
ECHO.   
uuu -b emmc_all u-boot.imx core-image-imx6sxsabresd.sdcard.bz2/*
ECHO.  
ECHO.  
ECHO.
echo %ESC%[1;31m
ECHO *** Please check "Okay" below after sending information into Uboot
echo %ESC%[0m
ECHO.
ECHO.
uuu FB: ucmd setenv ethaddr 26:E1:2C:C4:C7:C6
ECHO.
uuu FB: ucmd setenv eth1addr c2:42:5a:9f:cd:09
ECHO.
uuu FB: ucmd saveenv
echo %ESC%[1;31m 
ECHO ------------------------------------------------------------------------------------------------------
ECHO ----------------------------------   END        ------------------------------------------------------
ECHO ------------------------------------------------------------------------------------------------------
ECHO *** Please close your window
echo %ESC%[0m
PAUSE
:setESC
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
  set ESC=%%b
  exit /B 0
)
exit /B 0

1.2 UUU Script 기반의 Batch 파일생성

상위기능은 기본적인 기능만을 사용하는 것으로, 좀 더 복잡하게 사용하고자 하면, uuu 내부 script를 연동하여 이를 batch file로 생성하여 만들어 사용하자. 

  • UUU Script (List) 관련내용(필독) 
  1. SDPS: Stream download 로  MX8QXPB0 이후 버전만 가능
  2. SDP:  iMX6/iMX7 HID download protocol로 SDPS로 동일기능이지만 HID로 download
  3. FB: Fastboot protocol 이용 
나머지 내용은 아래 링크 참조 

Linux Image는 간단하게 하나의 Image로 생성해서 만들어서 구우면 되지만, Android의 경우, 각 Partition을 만들어서 Write해야 하므로 
조금 복잡하므로 UUU list (Script)를 만들어서 실행해어야 한다. 

이전에 사용했던 batch file이 Linux Image이라고 생각하면 되겠다. 

  • uuu-list.txt 생성 (uuu script)
아래의 예제는 i.MX8QXP부터 가능하며, 동작방식은 u-boot를 booting 후 아래의 uboot command들을 직접 실행을 하는 것이다.
uuu_version 1.3.74 
SDPS: boot -f u-boot-imx8qxp-mek-c0-uuu.imx
FB: ucmd setenv fastboot_dev mmc 
FB: ucmd setenv mmcdev 0 
FB: ucmd mmc dev 0 
FB: ucmd mmc dev 0 0 
FB: ucmd mmc erase 0x2000 0x10 
FB: ucmd mmc partconf 0 1 1 1 
FB[-t 600000]: flash bootloader0 u-boot-imx8qxp-c0.imx
FB[-t 600000]: flash gpt partition-table-7GB.img
FB: ucmd setenv fastboot_dev sata 
FB: ucmd setenv fastboot_dev mmc 
FB[-t 600000]: flash dtbo_a dtbo-imx8qxp-mipi.img
FB[-t 600000]: flash boot_a boot.img
FB[-t 600000]: flash vbmeta_a vbmeta-imx8qxp-mipi.img
FB[-t 600000]: flash super super.img
FB[-t 600000]: erase misc
FB[-t 600000]: erase presistdata
FB[-t 600000]: erase fbmisc
FB[-t 600000]: erase metadata
FB: set_active a
FB[-t 600000]: erase userdata
FB: done 

상위 동작은 board에 u-boot-imx8qxp-mek-c0-uuu.imx booting 후 UUU가 동작한 후 ucmd로 별도의 u-boot-imx8qxp-c0.imx Write 진행한다. 
  1. u-boot-imx8qxp-mek-c0-uuu.imx : UBOOT Config UUU 지원
  2. u-boot-imx8qxp-c0.imx : UBOOT Config UUU 미지원
두개의 uboot를 사용이유는 보안문제로 이기 때문인것으로 파악되며, 외부에서 함부로 bootloader를 접근못하게 하는 것이다. 
또한 이 문제로 Android의 경우 u-boot-imx8qxp-mek-c0-uuu.imx write를 진행을 하지만 실제 bootloader는 u-boot-imx8qxp-c0.imx 기반으로 동작된다. 

이 문제로 인하여 uuu로는 단일 Partition write가 힘들지만, Android 소스를 변경했을 경우 빌드 진행 후 vbmeta 정보가 변경되어 (Partition의 hash 값이 변경)
단일 Partition write가 uuu로는 불가능하다. 

하지만 Android 전체빌드 후 전체 Partition Write 상위와 같이 가능하다. 


마지막에 a/b slot의 설정의 a 영역으로 설정진행 (fastboot 기능)
  1. SDPS: Stream download after MX8QXPB0
  2. SDP:  iMX6/iMX7 HID download protocol.
  3. FB[-t timeout]:\Fastboot: android fastboot protocol. unit of timeout is ms
  4. FBK: community with kernel with fastboot protocol. DO NOT compatible with fastboot tools.

mmc partconf 0 1 1 1 

  • 상위 uuu-list 적용 batch 파일
이전의 batch 파일과 거의 동일하지만, 대신에 uuu-list.txt를 만들어 직접 설정하도록함
@ECHO OFF
TITLE Jeonghun's i.MX6 Burn_eMMC.bat
rem  
rem  * Author:  Jeonghun Lee
rem  * Description: 
rem    - This batch file is used for burning a Image into eMMC
rem    
setlocal
call :setESC
echo %ESC%[1;31m 
ECHO ------------------------------------------------------------------------------------------------------
ECHO ---------------------------      CAUTION           ---------------------------------------------------
ECHO ------------------------------------------------------------------------------------------------------
echo %ESC%[0m
ECHO Ready to burn an image on eMMC in iMX6 board 
ECHO Please check your bootmode or usb connection on your board if not work properly
echo %ESC%[1;31m
ECHO *** Please check "Connected Known USB devices" below
ECHO.     
ECHO     Chip          Vid         Pid
ECHO     -------------------------------
ECHO                  0x0525    0xA4A5 
ECHO      MX6SX       0x15A2    0x0071 
echo %ESC%[0m
ECHO.
uuu -lsusb
ECHO.  
echo %ESC%[1;31m
ECHO *** Please check "Success 1" and "Done" below after writing the Image  
echo %ESC%[0m
ECHO.   
uuu  uuu-list.txt
ECHO.  
ECHO.  
ECHO.
echo %ESC%[1;31m
ECHO *** Please check "Okay" below after sending information into Uboot
echo %ESC%[0m
ECHO.
echo %ESC%[1;31m 
ECHO ------------------------------------------------------------------------------------------------------
ECHO ----------------------------------   END        ------------------------------------------------------
ECHO ------------------------------------------------------------------------------------------------------
ECHO *** Please close your window
echo %ESC%[0m
PAUSE
:setESC
for /F "tokens=1,2 delims=#" %%a in ('"prompt #$H#$E# & echo on & for %%b in (1) do rem"') do (
  set ESC=%%b
  exit /B 0
)
exit /B 0

2. i.MX 의 Android flashtool 예제 분석 

Android 용 uuu flash batch file인데, batch file로는 너무 좋은예제인 것 같아 아래와 같이 넣어 놓는다. 
사실 상위 uuu.list는 아래의 batch file의 결과를 수정하여 만들 것이므로, i.MX에서 제공하는 아래의 batch file을 사용할 필요가 없다.  
직접 본인이 만들어 사용하는 것이 편하다. 

동작원리는 최종결과물에 uuu.lst를 상위와 거의동일한 script 만들어가면서, 이때 파일의 심볼릭링크 link를 같이 이용한다.
나의 경우는 link 대신 직접 파일이름을 넣어 이전 uuu.list를 작성했다.  

최종동작원리는 uuu 와 uuu.lst를 같이 동작한 후 이를 삭제하도록 하는 구조이며 이부분만 파악하면된다. (463 Line)

  • uuu_imx_android_flash.bat