Rockchip U-Boot 분석

U-Boot 소개

Rockchip U-Boot는 다음을 지원하는 오픈 소스 UBoot 2014.10 공식 버전을 기반으로합니다.

  • 지원 칩 : RK3288, RK3036, RK312X, RK3368, RK322X, RK3366, RK3399, RK3328, RK322XH 등
  • Android 플랫폼의 펌웨어 시작을 지원합니다.
  • 프로그램에 ROCKUSB 및 Google Fastboot 지원;
  • 보안 부팅 펌웨어 서명 암호화 보호 메커니즘을 지원합니다.
  • LVDS, EDP, MIPI, HDMI, CVBS와 같은 디스플레이 장치 지원;
  • SDCard, Emmc, Nand Flash 및 U 디스크와 같은 저장 장치를 지원합니다.
  • 부팅 로고 디스플레이, 충전 애니메이션 디스플레이, 저전력 관리, 전원 관리를 지원합니다.
  • I2C, SPI, PMIC, CHARGE, GUAGE, USB, GPIO, PWM, DMA, GMAC, EMMC, NAND 인터럽트 및 기타 드라이버 지원;

플랫폼 아키텍처 지원

Rockchip U-Boot는 U-Boot 2014.10의 공식 버전을 기반으로하며 주요 지점의 일부 주요 업데이트를 업데이트하고 새로운 구성 및 컴파일 아키텍처를 지원하며 여러 플랫폼을 동시에 개발할 수 있도록합니다.

컴파일과 설정

툴체인 구성

Rockchip U-Boot는 U-BOOT 루트 디렉토리의 Makefile에 지정된 Google Android에서 제공하는 GCC ToolChain으로 기본 설정됩니다.

GCC ToolChain

참고 : ARCHV는 64 비트와 32 비트 GCC 툴체인을 구별하고 ARCHV = aarch64 매개 변수를 추가 할 때 추가합니다.

플랫폼 구성

플랫폼 구성 파일은 U-Boot 루트 디렉토리 아래의 configs 폴더에 있으며 Rockchip 관련은 RK로 시작하며 제품 형태에 따라 MID와 BOX로 나뉩니다.

rk3288_defconfig
rk3126_defconfig
rk3128_defconfig
rk3368_defconfig
rk3288_box_defconfig
rk3128_box_defconfig
rk3036_box_defconfig
rk3368_box_defconfig
rk322x_box_defconfig
rk322xh_box_defconfig
rk3328_box_defconfig

Rockchip 칩 플랫폼의 구성은 주로 칩 유형이며 Rockchip의 일부 주요 구성은 savedefconfig 모드로 저장됩니다.

rk322x_box_defconfig를 예로 들어 관련 구성의 의미를 설명하십시오.

1
2
3
4
5
CONFIG_SYS_EXTRA_OPTIONS="RKCHIP_RK322X,PRODUCT_BOX,NORMAL_WORLD,SECOND_LEVEL_BOOTLOADER,BAUDRATE=1500000" 
CONFIG_ARM=y
CONFIG_ROCKCHIP=y
CONFIG_ROCKCHIP_ARCH32=y
CONFIG_SYS_EXTRA_OPTIONS="RKCHIP_RK322X,PRODUCT_BOX,NORMAL_WORLD,SECOND_LEVEL_BOOTLOADER, BAUDRATE=1500000"

이 옵션의 구성은 매크로 정의로 컴파일되고 관련 항목 앞에 자동으로 CONFIG_가 추가됩니다 U-BOOT 자동 생성 구성 파일 (include/config.h)에서 생성 된 매크로 정의를 볼 수 있습니다. 시스템의 구성 파일을 관리하는 구성 파일.

RKCHIP_RK322X : RK322x의 칩 유형을 정의하고 컴파일하고 CONFIG_ RKCHIP_RK322X로 확장하십시오.

PRODUCT_BOX : BOX 제품을 정의합니다. 현재 제품 양식에는 MID 및 BOX가 있으며, 컴파일하고 CONFIG_PRODUCT_BOX로 확장합니다.

NORMAL_WORLD : U-BOOT가 일반 세계에서 실행되도록 정의합니다.

SECOND_LEVEL_BOOTLOADER : U-BOOT를 보조 로더 모드로 정의이 옵션은 NAND Flash 프로젝트 및 보안 프레임 워크 드라이버를 사용할 때 정의해야합니다. CONFIG_SECOND_LEVEL_BOOTLOADER 로의 확장 확장;

BAUDRATE = 1500000 : 디버그 직렬 포트의 전송 속도를 정의하며 기본값은 115200이며 1.5M으로 구성됩니다. CONFIG_BAUDRATE = 1500000으로 확장을 컴파일하십시오.

CONFIG_ARM = y
ARM 플랫폼을 정의하십시오.

CONFIG_ROCKCHIP = y
Rockchip의 플랫폼을 정의하십시오.

CONFIG_ROCKCHIP_ARCH32 = y
RK 칩 시리즈 유형 플랫폼, RK30 시리즈, RK32 시리즈 및 기타 32 비트 칩을 정의하십시오.

CONFIG_ROCKCHIP_ARCH64 = y
RK33 시리즈와 같은 64 비트 칩인 RK 칩 시리즈 유형의 플랫폼을 정의하십시오.

시스템 구성

시스템 구성 파일은 U-Boot 루트 디렉토리 아래의 include\configs 폴더에 있으며 RK로 시작합니다.

rk_default_config.h
rk30plat.h
rk32plat.h
rk33plat.h

  • Rk_default_config.h : RK 플랫폼의 공개 구성으로 기본적으로 모든 필수 기능이 열립니다.
  • RK30plat.h : RK30 시리즈 플랫폼 구성, 메모리 주소, 일부 기능 모듈의 간단한 구성과 같은 다른 칩 구성에 따라 RK30 시리즈에는 RK3036, RK3126, RK3128, RK322x 및 기타 칩이 포함됩니다.
  • RK32plat.h : RK32 시리즈 플랫폼 구성, 메모리 주소, 일부 기능 모듈의 간단한 구성과 같은 다른 칩 구성에 따라 RK32 시리즈에는 RK3288이 포함됩니다.
  • RK33plat.h : RK33 시리즈 플랫폼 구성, 메모리 주소, 일부 기능 모듈의 간단한 구성과 같은 다른 칩 구성에 따라 RK33 시리즈에는 RK3368, RK3366, RK3399, RK3328, RK322XH 등이 포함됩니다.

참고 :이 파일에서는 //를 주석으로 사용할 수 없으므로 U-BOOT에서 lds 파일을 구문 분석 할 수 있습니다. 관련 모듈을 정의하지 않으려면 /* */ 또는 #undef를 직접 사용할 수 있습니다.

주요 시스템 구성 지침 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* 
* UBOOT memory map
*
* CONFIG_SYS_TEXT_BASE is the default address which maskrom loader UBOOT code.
* CONFIG_RKNAND_API_ADDR is the address which maskrom loader miniloader code.
*
* kernel load address: CONFIG_SDRAM_PHY_START + 32M, size 16M,
* miniloader code load address: CONFIG_SDRAM_PHY_START + 48M, size 8M,
* total reverse memory is CONFIG_LMB_RESERVE_MEMORY_SIZE.
*
*|---------------------------------------------------------------------------|
*|START - KERNEL LOADER - NAND LOADER - LMB - UBOOT - END|
*|SDRAM - START 32M - START 48M - START 56M - START 80M - 128M|
*| - kernel - nand code - fdt - UBOOT/ramdisk |
*|---------------------------------------------------------------------------|
*/
/* rk kernel load address */
#define CONFIG_KERNEL_LOAD_ADDR (CONFIG_RAM_PHY_START + SZ_32M) /* 32M offset */

/* rk nand api function code address */
#define CONFIG_RKNAND_API_ADDR (CONFIG_RAM_PHY_START + SZ_32M + SZ_16M) /* 48M offset */

/* rk UBOOT reserve size */
#define CONFIG_LMB_RESERVE_SIZE (SZ_32M + SZ_16M + SZ_8M) /* 56M offset */

CONFIG_KERNEL_LOAD_ADDR 커널에서로드 한 주소를 32M의 DDR 오프셋으로 구성합니다.
CONFIG_RKNAND_API_ADDR DDR 오프셋 48M으로 Nand Flash 드라이버 API 인터페이스 주소를 구성합니다.
CONFIG_LMB_RESERVE_SIZE U-BOOT 예약 공간의 크기를 구성합니다.

1
2
3
4
5
6
7
8
/* rk ddr information */ 
#define CONFIG_RK_MAX_DRAM_BANKS 8 /* rk ddr max banks */
#define CONFIG_RKDDR_PARAM_ADDR (CONFIG_RAM_PHY_START + SZ_32M) /* rk ddr banks address and size */

#define CONFIG_RKTRUST_PARAM_ADDR (CONFIG_RAM_PHY_START + SZ_32M + SZ_2M) /* rk trust os banks address and size */

/* rk hdmi device information buffer (start: 128M - size: 8K) */
#define CONFIG_RKHDMI_PARAM_ADDR CONFIG_RAM_PHY_END

CONFIG_RK_MAX_DRAM_BANKS DDR 용량 정보를 전달하는 DDR 드라이브의 뱅크 수를 구성합니다.
CONFIG_RKDDR_PARAM_ADDR 32M 오프셋 된 용량 정보를 전송하도록 DDR 드라이브의 주소를 구성합니다.
CONFIG_RKTRUST_PARAM_ADDR ARM Trusted Firmware 사용시 커널이 예약 한 공간 정보를 구성합니다.
CONFIG_RKHDMI_PARAM_ADDR HDMI 구성에 대한 일부 정보에는 커널이 얻은 주소가 필요합니다.

1
2
3
#define CONFIG_RAM_PHY_START 0x00000000 
#define CONFIG_RAM_PHY_SIZE SZ_128M
#define CONFIG_RAM_PHY_END (CONFIG_RAM_PHY_START + CONFIG_RAM_PHY_SIZE)

위의 세 매크로는 전체 U-Boot에서 사용하는 SDRAM의 공간 범위를 정의합니다.

1
2
3
#define CONFIG_BOOTDELAY 0 
#define CONFIG_BOARD_DEMO
#define CONFIG_RK_IO_TOOL

CONFIG_BOOTDELAY U-Boot가 셸에서 시작 지연을 활성화할지 여부를 구성합니다. 기본값 0은 직접 시작하는 지연이 없음을 의미하며 3 초 지연해야하는 경우 3으로 정의됩니다.
CONFIG_RK_IO_TOOL U-Boot Shell에서 간단한 IO 도구 도구를 구성하십시오.
CONFIG_BOARD_DEMO 간단한 테스트 데모 프로그램 사용 여부를 구성하십시오.

1
#define CONFIG_MAX_MEM_ADDR RKIO_IOMEMORYMAP_START

CONFIG_MAX_MEM_ADDR은 SOC가 DDR에 액세스 할 수있는 최대 주소 물리적 공간을 정의합니다 .DDR의 실제 용량이이 값보다 크면 매크로가 작동하여 결국 DTB에 의해 커널로 전달됩니다.

1
#define CONFIG_SYS_TEXT_BASE 0x00200000 /* Resersed 2M space Runtime Firmware bin. */

CONFIG_SYS_TEXT_BASE는 U-BOOT 작업을위한 시작 공간을 정의합니다.

1
#define CONFIG_KERNEL_RUNNING_ADDR (CONFIG_SYS_TEXT_BASE + SZ_512K)

CONFIG_KERNEL_RUNNING_ADDR은 지정된 복사 커널의 주소입니다.이 매크로가 정의되면 U-BOOT는 커널을이 위치로 직접 복사하고 시작시 시작합니다. 그렇지 않으면 기본적으로 DDR 오프셋 32M에 복사됩니다. 압축되지 않은 커널을 사용하여 부팅 속도를 높이십시오.

CONFIG_RK_SDCARD_BOOT_EN
CONFIG_RK_SDMMC_BOOT_EN
CONFIG_RK_SDHCI_BOOT_EN
CONFIG_RK_FLASH_BOOT_EN
CONFIG_RK_UMS_BOOT_EN
이 매크로는 SOC에서 지원하는 저장 장치를 정의하고 활성화 및 undef 닫기를 정의합니다.

CONFIG_MERGER_TRUSTOS
CONFIG_RK_TOS_WITH_TA
CONFIG_MERGER_TRUSTOS UBOOT가 신뢰 이미지를 병합할지 여부를 구성하십시오.
CONFIG_RK_TOS_WITH_TA 구성 신뢰 이미지는 ta가있는 펌웨어이며 armv7 플랫폼은 매크로를 사용합니다.

1
2
#define CONFIG_SECUREBOOT_CRYPTO 
#define CONFIG_SECUREBOOT_SHA256

CONFIG_SECUREBOOT_CRYPTO 암호화 하드웨어 암호 해독 기능 활성화 여부를 설정하십시오 이제 칩에 암호화 모듈이있는 한 기본적으로이 칩을 열어 부팅 이미지의 SHA 확인 속도를 높입니다.
CONFIG_SECUREBOOT_SHA256은 SHA256 기능을 활성화하는 것으로, 이후의 일부 제품 보안 요구 사항이 점점 높아지고 있으며 sha256을 소개하겠습니다.

1
2
3
#define CONFIG_NORMAL_WORLD 
#define CONFIG_SECURE_RSA_KEY_IN_RAM
#define CONFIG_SECURE_RSA_KEY_ADDR (CONFIG_RKNAND_API_ADDR + SZ_2K)

Rockchip SOC가 ARM Trusted Fireware를 출시 한 후 U-BOOT는 일반적인 단어로 작동하므로 안전한 efuse에 직접 액세스 할 수 없으므로, 미니 로더는 DDR의 펌웨어 확인을 위해 공개 키를 U-BOOT에 전달해야합니다.

CONFIG_LCD
CONFIG_RK_POWER
CONFIG_PM_SUBSYSTEM
CONFIG_RK_CLOCK
CONFIG_RK_IOMUX
CONFIG_RK_I2C
CONFIG_RK_KEY
CONFIG_RK_EFUSE
CONFIG_CMD_ROCKUSB
CONFIG_CMD_FASTBOOT
CONFIG_RK_MCU

해당 모듈의 활성화 여부를 구성하십시오.

시스템 컴파일

32 비트 플랫폼은 RK3288을 예로 사용합니다.

1
2
make rk3288_defconfig 
make

64 비트 플랫폼은 RK3368을 예로 사용합니다.

1
2
make rk3368_defconfig 
make ARCHV=aarch64

Rockchip U-BOOT는 두 가지 빌드 스크립트를 제공합니다. mkv7.sh-32 비트 SOC 컴파일 및 mkv8.sh-64 비트 SOC 컴파일

스키마 파일

Rockchip SOC 아키텍처 관련 파일 디렉토리 :
arch\arm\include\asm\arch-rk32xx\
arch\arm\cpu\armv7\rk32xx\
arch\arm\include\asm\arch-rk33xx\
arch\arm\cpu\armv8\rk33xx\
board\rockchip\
common\

드라이버 관련 파일 디렉토리 :
drivers\

툴 관련 파일 디렉토리 :
tools\
tools\rk_tools\

펌웨어 생성

Rockchip 플랫폼 로더는 첫 번째 모드와 두 번째 모드로 구분되며 해당 로더 펌웨어는 다른 플랫폼 구성에 따라 생성됩니다. 보조 로더 모드는 매크로 CONFIG_SECOND_LEVEL_BOOTLOADER에 의해 정의됩니다.

레벨 1 로더 모드

U-BOOT는 Level 1 로더 모드로 EMMC 저장 장치 만 지원하며 컴파일 완료 후 생성 된 이미지는 다음과 같습니다.
RK3288LoaderU-BOOT_V2.17.01.bin

V2.17.01은 출시 된 버전 번호이며 Rockchip은 U-Boot 로더 버전을 정의하고 2.17은 스토리지 버전에 따라 정의됩니다. 고객은이 버전을 수정해서는 안됩니다 .01은 U-Boot에 의해 정의 된 작은 버전입니다. Makefile에서 수정되었습니다.

보조 로더 모드

U-Boot는 보조 로더 모드이며 펌웨어는 모든 저장 장치를 지원하며이 모드에서는 MiniLoader 지원이 필요하며 매크로는 CONFIG_MERGER_MINILOADER 매크로에 의해 생성됩니다. Arm Trusted Firmware를 도입하면 매크로 CONFIG_MERGER_TRUSTIMAGE에 의해 생성 된 신뢰 이미지가 생성됩니다.

예를 들어, 생성 된 이미지를 컴파일하는 Rk322x :
RK322XMiniLoaderAll_V2.31.bin
UBOOT.img
trust.img

V2.31은 출시 된 버전 번호이고 rockchip은 U-Boot 로더 버전을 정의하고 2.31은 스토리지 버전에 따라 정의되므로 고객은이 버전을 수정해서는 안됩니다.

UBOOT.img는 보조 로더로서 U-Boot 패키지입니다.

trust.img는 보조 로더로서 U-Boot 패키지입니다.

RK3036, RK3126, RK3128, RK322x, RK3368, RK3366, RK3399, RK3328, RK322XH 등은 2 차 로더 모드를 사용합니다.

캐시 메커니즘

Rockchip 시리즈 칩 캐시 인터페이스는 U-Boot에서 제공하는 표준 인터페이스를 사용하므로 자세한 내용은 공식 U-Boot 설명서를 참조하십시오.

캐시와 관련된 일부 구성 지침 :

  • CONFIG_SYS_ICACHE_OFF
    icache 스위치는 정의 된 경우 icache 기능을 비활성화하는 것을 의미합니다.
  • CONFIG_SYS_DCACHE_OFF
    dcache 스위치는 정의 된 경우 dcache 기능이 꺼져 있음을 의미합니다. 참고 : dcache를 시작하기 전에 mmu를 구성하십시오.
  • CONFIG_SYS_L2CACHE_OFF
    L2 캐시 스위치.
  • dcache 모드 구성
    CONFIG_SYS_ARM_CACHE_WRITETHROUGH 구성 dcache writethrouch 모드;
    CONFIG_SYS_ARM_CACHE_WRITEALLOC dcache writealloc 모드 구성; 기본값은 dcache 쓰기 저장 모드입니다.

icache의 일반적인 인터페이스는 다음과 같습니다.

1
2
void icache_enable (void); 
void icache_disable (void);

dcache의 일반적인 인터페이스는 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
void dcache_enable (void); 
void dcache_disable (void);

void flush_cache (unsigned long, unsigned long);
void flush_dcache_all(void);
void flush_dcache_range(unsigned long start, unsigned long stop);

void invalidate_dcache_range(unsigned long start, unsigned long stop);
void invalidate_dcache_all(void);
void invalidate_icache_all(void);

Rockchip은 i2c, spi, pmic, charge, guage, usb, gpio, pwm, dma, gmac, emmc, nand 인터럽트 및 기타 드라이버를 지원합니다.

인터럽트 메커니즘

Rockhip 플랫폼은 표준 U-Boot 인터럽트 인터페이스 기능을 지원합니다 :

1
2
3
4
5
6
7
8
9
10
void enable_interrupts (void); 
int disable_interrupts (void);

void irq_install_handler(int irq, interrupt_handler_t *handler, void *data);
void irq_uninstall_handler(int irq);
int irq_set_irq_type(int irq, unsigned int type);
int irq_handler_enable(int irq);
int irq_handler_disable(int irq);

static inline int gpio_to_irq(unsigned gpio);

Clock 드라이버

Rockchip Clock 관련 코드는 다음 위치에 있습니다.
arch\arm\include\asm\arch-rk32xx\clock.h
arch\arm\cpu\armv7\rk32xx\clock.c
arch\arm\cpu\armv7\rk32xx\clock-rk3288.c
arch\arm\cpu\armv7\rk32xx\clock-rk3036.c
arch\arm\cpu\armv7\rk32xx\clock-rk312x.c
arch\arm\include\asm\arch-rk33xx\clock.h
arch\arm\cpu\armv8\rk33xx\clock.c
arch\arm\cpu\armv8\rk33xx\clock-rk3368.c

기본 인터페이스 기능 정의는 arch\arm\include\asm\arch-rk32xx\clock.h에 있으며 자세한 내용은 주석을 참조하십시오.

1
2
3
4
/* 
* rkplat clock set pll mode
*/
void rkclk_pll_mode(int pll_id, int pll_mode);

pll 모드를 느리게 또는 보통으로 설정.

1
2
3
4
/*
* rkplat clock set for arm and general pll
*/
void rkclk_set_pll(void);

rk 칩의 관련 pll 구성

1
2
3
4
/*
* rkplat clock get arm pll, general pll and so on
*/
void rkclk_get_pll(void);

rk 칩 구성의 pll 가져 오기

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/* 
* rkplat clock pll dump
*/
void rkclk_dump_pll(void);
/*
* rkplat set sd clock src
* 0: codec pll; 1: general pll; 2: 24M
*/
void rkclk_set_sdclk_src(uint32 sdid, uint32 src);

/*
* rkplat set sd/sdmmc/emmc clock src
*/
unsigned int rkclk_get_sdclk_src_freq(uint32 sdid);

/*
* rkplat set sd clock div, from source input
*/
int rkclk_set_sdclk_div(uint32 sdid, uint32 div);

void rkclk_emmc_set_clk(int div);

/*
* rkplat get PWM clock, PWM01 from pclk_cpu, PWM23 from pclk_periph
*/
unsigned int rkclk_get_pwm_clk(uint32 id);

/*
* rkplat get I2C clock, I2c0 and i2c1 from pclk_cpu, I2c2 and i2c3 frompclk_periph
*/
unsigned int rkclk_get_i2c_clk(uint32 i2c_bus_id);

/*
* rkplat get spi clock, spi0 and spi1 from pclk_periph
*/
unsigned int rkclk_get_spi_clk(uint32 spi_bus);

/*
* rkplat lcdc aclk config
* lcdc_id (lcdc id select) : 0 - lcdc0, 1 - lcdc1
* pll_sel (lcdc aclk source pll select) : 0 - codec pll, 1 - general pll
* div (lcdc aclk div from pll) : 0x00 - 0x1f
*/
int rkclk_lcdc_aclk_set(uint32 lcdc_id, uint32 pll_sel, uint32 div);

/*
* rkplat lcdc dclk config
* lcdc_id (lcdc id select) : 0 - lcdc0, 1 - lcdc1
* pll_sel (lcdc dclk source pll select) : 0 - codec pll, 1 - general pll
* div (lcdc dclk div from pll) : 0x00 - 0xff
*/
int rkclk_lcdc_dclk_set(uint32 lcdc_id, uint32 pll_sel, uint32 div);

/*
* rkplat lcdc dclk and aclk parent pll source
* lcdc_id (lcdc id select) : 0 - lcdc0, 1 - lcdc1
* dclk_hz: dclk rate * return dclk rate
*/
int rkclk_lcdc_clk_set(uint32 lcdc_id, uint32 dclk_hz);

/*
* rkplat pll select by clock
* clock: device request freq HZ
* return value:
* high 16bit: 0 - codec pll, 1 - general pll
* low 16bit : div
*/
uint32 rkclk_select_pll_source(uint32 clock, uint32 even);

정상적인 상황에서는 시계의 내용을 수정할 필요가 없으며 권장 구성을 사용할 수 있습니다.

GPIO 드라이버

drivers\gpio\rk_gpio.c 파일의 Rockip 플랫폼 gpio 인터페이스 기능은 다음과 같습니다. RK GPIO 정의 규칙은 다음과 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
/*
* rk gpio api define the gpio format as:
* using 32 bit for rk gpio value,
* the high 24bit of gpio is bank id, the low 8bit of gpio is pin number
* eg: gpio = 0x00010008, it mean gpio1_b0, 0x00010000 is bank id of GPIO_BANK1, 0x00000008 is GPIO_B0
*/

/* bank and pin bit mask */
#define RK_GPIO_BANK_MASK 0xFFFFFF00
#define RK_GPIO_BANK_OFFSET 8
#define RK_GPIO_PIN_MASK 0x000000FF
#define RK_GPIO_PIN_OFFSET 0

32 비트 정의를 사용하면 상위 24 비트가 뱅크이고 하위 8 비트는 다음과 같은 특정 핀입니다.

1
gpio_direction_output(GPIO_BANK7 | GPIO_A4, 1);

특정 뱅크 및 핀은 다음 관련 문서에 정의되어 있습니다.
arch\arm\include\asm\arch-rk32xx\gpio.h
arch\arm\include\asm\arch-rk32xx\gpio-rk3036.h
arch\arm\include\asm\arch-rk32xx\gpio-rk312X.h
arch\arm\include\asm\arch-rk32xx\gpio-rk3288.h
arch\arm\include\asm\arch-rk33xx\gpio.h
arch\arm\include\asm\arch-rk33xx\gpio-rk3368.h

인터페이스 기능은 다음과 같습니다.

1
2
3
4
/*
* Set gpio direction as input
*/
int gpio_direction_input(unsigned gpio);

해당 GPIO를 입력 포트로 구성하십시오.

1
2
3
4
/*
* Set gpio direction as output
*/
int gpio_direction_output(unsigned gpio, int value);

해당 GPIO를 출력 포트로 구성하십시오.

1
2
3
4
/*
* Get value of the specified gpio
*/
int gpio_get_value(unsigned gpio)

GPIO 관련 IO의 입력 레벨을 가져옵니다.

1
2
3
4
/*
* Set value of the specified gpio
*/
int gpio_set_value(unsigned gpio, int value);

GPIO 관련 IO의 출력 레벨을 구성하십시오.

1
2
3
4
/*
* Set gpio pull up or down mode
*/
int gpio_pull_updown(unsigned gpio, enum GPIOPullType type);

GPIO 관련 IO의 상하 풀을 구성하십시오.

1
2
3
4
/*
* gpio drive strength slector
*/
int gpio_drive_slector(unsigned gpio, enum GPIODriveSlector slector);

GPIO 관련 IO의 드라이브 기능을 구성하십시오.

IOMUX 드라이버

Rockchip 플랫폼 GPIO 멀티플렉싱 기능 구성, 드라이버 파일

arch\arm\include\asm\arch-rk32xx\iomux.h
arch\arm\cpu\armv7\rk32xx\iomux.c
arch\arm\cpu\armv7\rk32xx\iomux-rk3036.c
arch\arm\cpu\armv7\rk32xx\iomux-rk312X.c
arch\arm\cpu\armv7\rk32xx\iomux-rk3288.c
arch\arm\include\asm\arch-rk33xx\iomux.h
arch\arm\cpu\armv8\rk33xx\iomux.c
arch\arm\cpu\armv8\rk33xx\iomux-rk3368.c
void rk_iomux_config(int iomux_id);

ID는 arch\arm\include\asm\arch-rk32xx\iomux.h에 정의되어 있습니다.

I2C 드라이버

Rk I2C는 표준 U-Boot 아키텍처를 지원합니다 자세한 내용은 U-Boot 설명서를 참조하십시오 관련 코드는 다음 위치에 있습니다.
drivers\i2c\rk_i2c.c

참고 : 현재 i2c 읽기 및 쓰기의 최대 길이는 32 바이트이므로 드라이버가 향상됩니다.

int i2c_set_bus_num(unsigned bus_idx)
i2c 버스가 작동하도록 설정하십시오. 먼저 구성해야합니다.

void i2c_init(int speed, int unused)
해당 버스의 i2c를 초기화하십시오.

int i2c_set_bus_speed(unsigned int speed)
필요한 i2c 버스 주파수 구성

int i2c_probe(uchar chip)
지정된 i2c 주소를 감지하는 장치가 존재하는지 여부

int i2c_read(uchar chip, uint addr, int alen, uchar *buf, int len)
I2C 읽기 작업

int i2c_write(uchar chip, uint addr, int alen, uchar *buf, int len)
I2C 쓰기 작업

SPI 드라이버

RK SPI는 표준 U-Boot 아키텍처를 지원합니다 자세한 내용은 U-Boot 설명서를 참조하십시오 관련 코드는 다음 위치에 있습니다.
drivers\spi\rk_spi.c

LCD 드라이버

디스플레이 모듈 관련 코드는 다음과 같습니다.

drivers/video/rockchip_fb.c
drivers/video/rockchip_fb.h
drivers/video/rk32_lcdc.c
drivers/video/rk3036_lcdc.c
drivers/video/rk3368_lcdc.c

화면의 전원 제어 정보 : rockhip_fb.c에서 rk_fb_pwr_ctr_prase_dt는 전원 제어 인터페이스를 dts로 구문 분석하고 rk_fb_pwr_enable/disable 기능은 각각 디스플레이 모듈의 전원을 전환합니다. 화면의 전원 켜기 순서를 다시 조정해야하는 경우이 기능을 수정할 수 있습니다.

U-Boot에서 사용하는 로고는 커널의 루트 디렉토리에 저장되며 컴파일 과정에서 resource.img 파일로 패키지됩니다 로고의 U-Boot 확인에 대해서는 common/lcd.crk_bitmap_from_resource() 함수를 참조하십시오.
부팅 로고 로딩 과정 :

  1. rk_bitmap_from_resource에서 리소스 파티션의 로고를 구문 분석하십시오.
  2. 리소스 파티션을로드하지 못하면 부트 파티션의 리소스에서 로고가로드됩니다.
  3. U-Boot의 기본 로고 표시 프로세스이므로 logo.bmp 이미지가 커널 디렉토리에 포함되어 있지 않더라도 U-Boot는 화면 중간에 다음과 같은 그림을 표시합니다.

logo

rockchip.bmp라는이 맵은 /u-boot/tools/logos 디렉토리에 저장됩니다 UBOOT.bin의 크기를 최소화하기 위해 이이미지는 매우 작습니다 (200x500, 8 비트 bmp 이미지 만). 부팅 로고를 바꾸려면 U-Boot의 rockchip.bmp를 수정하는 대신 커널에서 logo.bmp를 수정하는 것이 좋습니다.

  1. logo_kernel.bmp가 리소스 파티션에 존재하면 U-Boot는 이미지를 ddr에로드하고 명령 줄을 통해 위치를로드하도록 커널에 알리고 새 로고 이미지를 표시합니다.
    또한 bmp에 대한 U-Boot의 지원이 약하다는 점을 강조해야하며 현재 다음과 같은 제한 사항을 알고 있습니다.
    균일 한 해상도의 이미지 만 지원
    모든 bmp 이미지는 다음 명령으로 처리하는 것이 좋으며 처리 된 logo_rle8.bmp가 표시에 사용됩니다.
    convert -compress rle -colors 256 logo.bmp logo_rle8.bmp
  2. 지원 24 비트 bmp 부팅 로고 디스플레이, 지원 커널 업데이트 24 비트 로고 디스플레이.
    참고 : MID 관련 프로젝트의 경우 U-Boot에서 HDMI 관련 구성을 열지 마십시오.

PMIC 드라이버

U-Boot에서 부팅 로고, 충전 애니메이션 및 기타 기능을 구현하려면 시스템의 전원을 제어해야합니다. 이러한 기능은 PMU 드라이버에서 구현됩니다.
현재 RK U-Boot는 Ricoh 619, ACT8846 및 RK808과 자동으로 호환됩니다. RK312X 프로젝트의 경우 ADC 전력 감지 및 충전 애니메이션 표시가 현재 지원됩니다. 관련 코드는 다음과 같습니다.
drivers/power/power_core.c
drivers/power/power_rockchip.c
drivers/power/pmic/pmic_act8846.c
drivers/power/pmic/pmic_ricoh619.c
drivers/power/pmic/pmic_rk808.c
drivers/power/pmic/pmic_rk818.c
drivers/power/fuel_gauge/fg_adc.c

power_core.c는 U-Boot 전원 하위 시스템의 핵심 코드이며 pmic, 충전기 및 연료 게이지를 관리하기위한 인터페이스를 제공합니다. power_rockchip.c는 Rockchip 플랫폼 pmic, 충전기 및 연료 게이지와 호환되는 프레임 워크 계층 코드입니다. 시스템 호출을 위해 통합 인터페이스가 위쪽으로 제공되며 다양한 전원 IC가 아래쪽으로 관리됩니다. 다른 PMIC마다 구동됩니다.
시스템이 시작되면 pmic_init 시스템 호출을 통해 rk32xx.c 파일의 board_late_init(void)에서 PMIC가 초기화됩니다.

연료 게이지 드라이브

U-Boot 충전과 같은 기능을 구현하려면 연료 게이지 (fuel_gauge)에 대한 지원을 추가해야합니다. 현재 RK U-Boot는 2 개의 Ricoh619 및 cw201x 연료 게이지를 지원합니다.
drivers/power/fuel_gauge/fg_cw201x.c
drivers/power/fuel_gauge/fg_cw201x.c

시스템이 시작되면 rk32xx.c board_late_init에서 fg_init 인터페이스를 호출하여 연료 게이지가 초기화됩니다.
fg_initpower_rockchip.c에서 구현됩니다.

fg_init

연료 게이지 드라이버의 경우 다음과 같은 중요한 인터페이스를 구현해야합니다.
fg_xxx_init() :이 함수는 기본 연료 게이지 초기화 및 등록을 수행합니다.

fg_xxx_init

이름은 PMIC를 검색하는 데 사용됩니다 (U-Boot의 전원 시스템에서 pmic, charger 및 fuel_gauge는 pmic 장치로 추상화 됨). 여기에있는 이름은 시스템 검색을 위해 fg_names of power_rockchip.c에도 등록되어 있습니다.

fg_names

FG의 ops 인터페이스 : 주로 배터리의 전원 및 충전 상태를 얻는 데 사용

FG의 ops 인터페이스

fg_battery_update 인터페이스는 배터리의 전원, 전압 및 기타 정보를 업데이트하는 데 사용되며 fg_battery_check 인터페이스는 배터리 충전 여부를 확인하는 데 사용됩니다.
충전 애니메이션을 구현하려면 rk32plat.h/rk30plat.h에서 다음 스위치를 열어야합니다. 기본적으로이 기능은 해제되어 있습니다.

1
2
3
4
5
#define CONFIG_UBOOT_CHARGE 
#define CONFIG_CMD_CHARGE_ANIM
#define CONFIG_CHARGE_DEEP_SLEEP //ricoch619의 PMU 및 ADC 감지를 사용하십시오.이 옵션을 열지 마십시오
#define CONFIG_SCREEN_ON_VOL_THRESD 3550 //3.55v
#define CONFIG_SYSTEM_ON_VOL_THRESD 3650 //3.65v

그 중 CONFIG_SCREEN_ON_VOL_THRESD는 시스템 조명 화면의 전압 임계 값이며이 전압 아래에서는 시스템이 밝아지지 않습니다. CONFIG_SYSTEM_ON_VOL_THRESD는 시스템이 정상적으로 시작하기위한 전압 임계 값이며이 전압 이하에서는 U-Boot가 커널을 시작할 수 없습니다. 이 두 전압은 특정 제품 설계에 따라 유연하게 조정할 수 있습니다.
이 두 임계 값의 판단은 power_rockchip.c에서 구현됩니다.

power_rockchip.c

또한 충전 애니메이션 및 부팅 로고를 표시하려면 dts에서 UBOOT-logo-on 속성을 설정하십시오.

DTS

스토리지 드라이버

U-Boot는 emmc, nand flash, sdcard 및 USB 플래시 드라이브와 같은 저장 장치를 지원합니다 nand 플래시 드라이버가 열려 있지 않음 인터페이스가 미니 로더를 통해 U-Boot로 전달되므로 nand 플래시 장치를 지원해야하는 경우 CONFIG_SECOND_LEVEL_BOOTLOADER를 정의하고 그렇지 않으면 U-Boot를 정의해야합니다. emmc 만 지원됩니다.
저장소의 Rockchip 저장 장치 추상화, 코드는 board/rockchip/common/storage/storage.c에 있으며 해당 API 인터페이스는 다음과 같습니다.

1
2
3
4
5
6
7
8
9
int32 StorageInit(void);

uint16 StorageGetBootMedia(void);

int StorageReadLba(uint32 LBA, void *pbuf, uint32 nSec);
int StorageWriteLba(uint32 LBA, void *pbuf, uint32 nSec, uint16 mode);

int StorageReadPba(uint32 PBA, void *pbuf, uint32 nSec);
int StorageWritePba(uint32 PBA, void *pbuf, uint32 nSec);

Google Fastboot

Google Fastboot는 로더에서 제공하는 rockusb/adb와 같은 대화식 모드입니다. Fastboot 상호 작용에서 사용되는 PC 도구 소스는 Android 소스 코드 (system/core/fastboot/)에 있으며 Windows 버전과 Linux 버전으로 나뉩니다 (Windows 쪽에서 사용하는 장치 드라이버는 adb와 동일).

Fastboot로 들어가는 방법

  1. 시작하는 동안 부팅 프로그램 시작 단계에서 버튼을 누릅니다 (3288sdk 보드는 vol-key입니다).
1
2
3
4
5
6
   checkKey((uint32 *)&boot_rockusb, (uint32 *)&boot_recovery, (uint32 *)&boot_fastboot);
....
} else if(boot_fastboot && (vbus!=0)){
printf("fastboot key pressed.\n");
frt = FASTBOOT_REBOOT_FASTBOOT;
}
  1. fastboot 매개 변수가있는 reboot 명령 (reboot fastboot, PMU_SYS_REG0 레지스터를 통해 전달됨)

Fastboot에서 지원하는 명령

정보 얻기

  • Fastboot getvar version 버전 얻기
  • fastboot getvar version-bootloader 버전 얻기
  • fastboot getvar unlocked 잠금 해제 상태 얻기
  • fastboot getvar secure 잠금 해제 상태 (unlocked와 반대로) 얻기
  • fastboot getvar product 제품 정보 얻기
  • fastboot getvar serialno 일련 번호 얻기
  • fastboot getvar partition-type: 지정된 파티션 유형을 얻습니다.
  • fastboot getvar partition-size: 지정된 파티션 크기를 가져옵니다.
  • fastboot getvar partition-offset: 지정된 파티션 오프셋을 가져옵니다.

이미지 레코딩

fastboot flash <partition_name> <filename> 펌웨어 레코딩
(예 : fastboot flash system system.img.
parameter/loader를 레코딩 할 때 파티션 이름을 “parameter”/“loader”로 지정)
fastboot update <filename> burn 업그레이드 패키지 작성
(업그레이드 패키지는 android 소스 코드에서 updatepackage를 작성하여 생성됨)

다시 시작

fastboot oem recovery recovery로 재부팅
fastboot oem recovery:wipe_data 공장 설정 재시작 및 복원
fastboot reboot 다시 시작
fastboot reboot-bootloader rockusb 프로그래밍 모드로 다시 시작
fastboot continue 다시 시작

장치 잠금 해제 및 잠금

fastboot oem unlock 잠금 해제
fastboot oem unlock_accept 잠금 해제 확인 (fastboot oem unlock 명령 후 5 초 이내에 입력 필요)
fastboot oem lock 잠금 장치

특별 주문

fastboot boot <kernel> [ <ramdisk> ] 지정된 펌웨어에서 일시적으로 부팅 (커널은 현재 Image / zImage를 지원하며 커널 끝 또는 리소스 파티션에 dtb를 저장해야 함)
fastboot oem log 직렬 포트 로그 정보 얻기
fastboot oem ucmd <UBOOT cmds> UBOOT 명령을 실행하십시오.

fastboot 잠금 해제

fastboot가 잠기면 oem 명령을 프로그래밍하고 실행할 수 없으며 초기 상태는 잠 깁니다.
잠금 해제 프로세스는 대략 다음과 같습니다.

  1. 패스트 부트 OEM 잠금 해제 실행
  2. 5 초 이내에 fastboot oem unlock_accept를 계속 실행하십시오.
  3. 기계는 복구로 재부팅하고 공장 설정으로 복원
  4. fastboot를 다시 입력하십시오. fastboot getvar 잠금 해제는 “yes”를 리턴해야합니다 (장치 잠금 해제)

fastboot 명령이 fastboot 상태로 들어간 후 장치를 찾을 수 없다는 메시지를 표시하면 명령에 -i 매개 변수를 추가하여 장치 vid를 지정해야합니다 (예 : fastboot -i 0x2207 getvar unlocked).

펌웨어 로딩

펌웨어로드에는 boot, recovery, kernel, resource 파티션 및 dtb 파일이 포함됩니다.

Boot/Recovery 파티션

Boot 및 Recovery 펌웨어는 두 가지 형태로 나뉩니다.

  1. 안드로이드 표준 형식
    표준 펌웨어 형식은 ramdisk와 kernel을 함께 패키징합니다 이미지 파일의 마법 번호는 “ANDROID!”입니다.
1
2
00000000 41 4E 44 52 4F 49 44 21 24 10 74 00 00 80 40 60 ANDROID!$.t...@` 
00000010 F9 31 CD 00 00 00 00 62 00 00 00 00 00 00 F0 60 .1.....b.......`

표준 형식에는 서명, 체크섬 및 dtb 파일과 같은 추가 데이터와 같은 정보가있을 수 있습니다. 펌웨어를 패키징 할 때 복구 이미지의 기본값은 표준 형식이며 표준 형식 부팅 이미지는 ./mkimage.sh ota로 생성해야합니다.

  1. RK 형식
    Rk 형식 이미지는 파일 (ramdisk / kernel)과 별도로 패키지되어 있습니다. 이미지 파일의 매직 번호는 “KRNL”입니다.
1
2
00000000 4B 52 4E 4C 42 97 0F 00 1F 8B 08 00 00 00 00 00 KRNLB........... 
00000010 00 03 A4 BC 0B 78 53 55 D6 37 BE 4F 4E D2 A4 69 .....xSU.7.ON..i

패키지에서 생성 된 kernel.img 및 기본 패키징 방법으로 생성 된 boot.img는 모두 Rk 형식입니다.

커널 파티션

커널 파티션은 커널 정보를 포함합니다. Boot/Recovery 파티션 자체에 시작시 커널 (Android 표준 형식)이있는 경우 커널 파티션이 무시되고 포함 된 커널이 먼저 사용됩니다.

Resource 파티션

Resource 이미지 형식은 여러 리소스 파일에 쉽게 액세스 할 수 있도록 설계된 간단한 이미지 형식입니다. 매직 번호는 “RSCE”입니다.

1
2
00000000 52 53 43 45 00 00 00 00 01 01 01 00 01 00 00 00 RSCE............ 
00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

U-Boot는 리소스 파티션에서 커널에 필요한 dtb 패키징을 지원합니다.

Dtb 파일

Dtb 파일은 새로운 버전의 커널 dts 구성 파일의 이진화 된 파일입니다.
현재 dtb 파일은 Android 표준 형식의 Boot/Recovery 파티션에 저장하거나 리소스 파티션에 저장할 수 있습니다. U-Boot는 커널이 dtb 파일을로드해야한다고 가정합니다.

펌웨어 로딩 프로세스

U-Boot로드 펌웨어 프로세스는 다음과 같습니다.

  1. 시작해야하는 boot/recovery 파티션의 램 디스크 내용을로드하십시오.
  2. 부팅 파티션의 커널 내용을로드하십시오. 실패하면 (Rk 형식으로) 커널 파티션로드를 계속하십시오
  3. 부팅 파티션의 dtb 파일을로드하십시오. 실패하면 계속해서 자원 파티션에서로드를 시도하십시오.

Dtb 파일 (fdt) 및 램 디스크는 U-Boot 동적 응용 프로그램의 메모리에로드됩니다. 커널은 메모리 32M 오프셋에로드되어 실행됩니다.

Boot_merger 도구

Boot_merger는 로더, ddr bin, usb plug bin 및 기타 파일을 패키징하여 프로그래밍 도구에 필요한 로더 형식을 생성하는 Linux 버전 도구입니다. 소스 코드는 U-Boot 소스 코드에 있습니다.

UBOOT# ls ./tools/boot_merger.*
./tools/boot_merger.c ./tools/boot_merger.h

Loader 패키징 및 패키징 풀기 지원

패키징 :

./tools/boot_merger [--pack] <config.ini>
패키징은 패키징 매개 변수를 설명하는 ini 구성 파일의 경로를 전달해야합니다.
(현재 사용되는 구성 파일은 다음과 같은 U-Boot 소스 코드 (tools/rk_tools/RKBOOT)에 저장됩니다)
./tools/boot_merger ./tools/rk_tools/RKBOOT/RK3288.ini
out:RK3288Loader_UBOOT.bin
fix opt:RK3288Loader_UBOOT_V2.15.bin
merge success(RK3288Loader_UBOOT_V2.15.bin)

패키징 풀기 :

./tools/boot_merger --unpack <loader.bin>

매개 변수 구성 파일

3288 구성 파일을 예로 들어 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[CHIP_NAME] 
NAME=RK320A ----칩 이름 : "RK"+ 4B 칩 모델과 maskrom 합의
[VERSION]
MAJOR=2 ----주요 버전 번호
MINOR=15 ----부 버전 번호
[CODE471_OPTION] ----Code471, 현재 ddr bin으로 설정
NUM=1
Path1=tools/rk_tools/32_LPDDR2_300MHz_LPDDR3_300MHz_DDR3_300MHz_20140404.bin
[CODE472_OPTION] ---Code472, 현재 usbplug bin으로 설정
NUM=1 Path1=tools/rk_tools/rk32xxusbplug.bin
[LOADER_OPTION]
NUM=2
LOADER1=FlashData ----flash data,현재 ddr bin으로 설정
LOADER2=FlashBoot ----flash boot,현재 UBOOT bin으로 설정
FlashData=tools/rk_tools/32_LPDDR2_300MHz_LPDDR3_300MHz_DDR3_300MHz_20140404.bin FlashBoot=u-boot.bin
[OUTPUT] ----출력 경로, 현재 파일 이름은 자동으로 버전 번호를 추가합니다
PATH=RK3288Loader_UBOOT.bin

Resource_tool 도구

Resource_tool은 임의의 리소스 파일을 패키징하고 리소스 이미지를 생성하는 Linux 도구입니다.
소스 코드는 U-Boot 소스 코드 (tools/resource_tool/)에 있습니다.

리소스 이미지 패키징 및 언 패킹 지원

패키징

./tools/resource_tool [--pack] [--image=<resource.img>] <file list>

같은 :

1
2
UBOOT/tools/resource_tool/resources# ../resource_tool `find . -type f` 
Pack to resource.img successed!

pack_resource.sh 스크립트는 기존 이미지에 자원 파일을 추가 할 수 있습니다.

./pack_resource <resources dir> <old image> <dst image> <resource_tool path>

같은 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    UBOOT# sudo ./tools/resource_tool/pack_resource.sh 
tools/resource_tool/resources/ ../kernel/resource.img resource.img
tools/resource_tool/resource_tool
Pack tools/resource_tool/resources/ & ../kernel/resource.img to resource.img ...

Unpacking old image(../kernel/resource.img):
rk-kernel.dtb

Pack to resource.img successed!

Packed resources:
rk-kernel.dtb charge_anim_desc.txt
images/battery_4.bmp images/battery_0.bmp images/battery_1.bmp images/battery_2.bmp
images/battery_3.bmp images/battery_5.bmp images/battery_fail.bmp resource.img

언패킹

./tools/resource_tool --unpack [--image=<resource.img>] [output dir]

Trust_merger 툴

Trust_merger는 프로그래밍 도구에 필요한 TrustImage 형식을 생성하기 위해 bl30, bl31 bin, bl32 bin 및 기타 파일을 패키징하기위한 Linux 버전 도구입니다. 소스 코드는 U-Boot 소스 코드에 있습니다.

UBOOT# ls ./tools/trust_merger.*
./tools/trust_merger.c ./tools/trust_merger.h

신뢰 패키징 및 언패킹 지원

패키징 :
./tools/trust_merger [--pack] <config.ini>

패키징은 패키징 매개 변수를 설명하는 ini 구성 파일의 경로를 전달해야합니다.
(현재 사용되는 구성 파일은 다음과 같은 U-Boot 소스 코드 (tools/rk_tools/RKTRUST)에 저장됩니다)

./tools/trust_merger ./tools/rk_tools/RKTRUST/RK3368.ini
out:trust.img
merge success(trust.img)

언패킹

./tools/trust_merger --unpack <trust.img>

매개 변수 구성 파일

3368 구성 파일을 예로 들어 보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[VERSION] 
MAJOR=0 ----주요 버전 번호
MINOR=1 ----부 버전 번호
[BL30_OPTION] ----bl30,현재 mcu bin으로 설정
SEC=1 ----BL30 bin이 존재
PATH=tools/rk_tools/bin/rk33/rk3368bl30_v2.00.bin ----출력 bin 경로 지정
ADDR=0xff8c0000 ----펌웨어 DDR에서로드 및 실행 주소
[BL31_OPTION] ----Bl31, 현재 멀티 코어 및 전원 관리 관련 bin으로 설정
SEC=1 ----BL31 bin이 존재
PATH=tools/rk_tools/bin/rk33/rk3368bl31-20150401-v0.1.bin----출력 bin 경로 지정
ADDR=0x00008000 ----펌웨어 DDR에서로드 및 실행 주소
[BL32_OPTION]
SEC=0 ----BL32 bin이 없습니다
[BL33_OPTION]
SEC=0 ----BL33 bin이 없습니다
[OUTPUT]
PATH=trust.img [OUTPUT] ----출력 펌웨어 이름

SDCard 및 U 디스크 부팅 업그레이드

Rockchip 장비는 RK 생산 도구로 사용자 정의 된 sdcard, u 디스크 등의 시작 및 업그레이드 기능을 지원합니다.

SDCard 부팅 및 업그레이드 구성

SDCard 업그레이드 및 부팅 기능은 매크로 CONFIG_RK_SDCARD_BOOT_EN으로 구성되고 rk_default_config.h는 기본적으로 해제되어 있습니다.이 기능을 사용해야하는 경우 rkxxplat.h 관련 플랫폼 구성 파일에서 정의하십시오.

UBoot는 업그레이드 된 sdcard를 인식하고 직렬 포트는 다음 메시지를 인쇄합니다.
SDCard Update.

시작된 sdcard 인 경우 다음 메시지를 인쇄합니다.
SDCard Boot.

U 디스크 부팅 및 업그레이드 구성

U 디스크 업그레이드 및 부팅 기능은 매크로 CONFIG_RK_UMS_BOOT_EN으로 구성되고 rk_default_config.h는 기본적으로 비활성화되어 있습니다.이 기능을 사용해야하는 경우 rkxxplat.h 관련 플랫폼 구성 파일에서 정의하십시오.

UBoot는 업그레이드 된 U 디스크를 인식하고 직렬 포트는 다음 메시지를 인쇄합니다.
UMS Update.

시작된 sdcard 인 경우 다음 메시지를 인쇄합니다.
UMS Boot.

기능적 구성

UMS 관련 매크로는 해당 rkxxplat.h에 정의되어 있습니다.
CONFIG_RK_UMS_BOOT_EN

U 디스크 부팅 및 업그레이드 기능을 지원하도록 U-Boot를 구성하고 open undef를 닫아 정의하십시오.
RKUSB_UMS_BOOT_FROM_DWC2_OTG
RKUSB_UMS_BOOT_FROM_DWC2_HOST
RKUSB_UMS_BOOT_FROM_EHCI_HOST1
RKUSB_UMS_BOOT_FROM_EHCI_HOST2
RKUSB_UMS_BOOT_FROM_EHCI_HOST3

U-Boot USB 프레임 워크의 한계로 인해 5 개의 선택 사항 중 하나의 USB 컨트롤러 만 켜서 USB 플래시 드라이브 기능을 활성화 할 수 있습니다.
다음은 rk32plat.h 관련 코드의 예입니다.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
#ifdef CONFIG_RK_UMS_BOOT_EN 
/*
* USB Host support, default no using
* Please first select USB host controller if you want to use UMS Boot
* Up to one USB host controller could be selected to enable for booting
* from USB Mass Storage device.
*
* PLS define a host controler from:
* RKUSB_UMS_BOOT_FROM_DWC2_OTG
* RKUSB_UMS_BOOT_FROM_EHCI_HOST1
* RKUSB_UMS_BOOT_FROM_DWC2_HOST
*
* First define the host controller here
*/

/* Check UMS Boot Host define */
#define RKUSB_UMS_BOOT_CNT
(defined(RKUSB_UMS_BOOT_FROM_DWC2_OTG) + \
defined(RKUSB_UMS_BOOT_FROM_EHCI_HOST1) + \
defined(RKUSB_UMS_BOOT_FROM_DWC2_HOST))

#if (RKUSB_UMS_BOOT_CNT == 0)
#error "PLS Select a USB host controller!"
#elif (RKUSB_UMS_BOOT_CNT > 1)
#error "Only one USB host controller can be selected!"
#else
#define CONFIG_CMD_USB
#define CONFIG_USB_STORAGE
#define CONFIG_PARTITIONS
#endif

/*
* USB Host support, default no using
* please first check plat if you want to using usb host
*/
#if defined(RKUSB_UMS_BOOT_FROM_EHCI_HOST1)
#define CONFIG_USB_EHCI
#define CONFIG_USB_EHCI_RK
#elif defined(RKUSB_UMS_BOOT_FROM_DWC2_HOST) ||
defined(RKUSB_UMS_BOOT_FROM_DWC2_OTG)
#define CONFIG_USB_DWC_HCD
#endif
#endif /* CONFIG_RK_UMS_BOOT_EN */

CONFIG_RK_UMS_BOOT_EN이 활성화되면 특정 칩 정의에 따라 해당 HOST 포트를 정의해야합니다. 정의가 없거나 정의가 너무 많으면 컴파일시 오류가보고됩니다.

컨트롤러 구성 테이블

board\rockchip\common\mediaboot\UMSBoot.c 특정 칩 플랫폼 및 컨트롤러에 따라 rkusb_hcd 구성 테이블을 채우면 USB Mass_storage가 구성에 따라 초기화됩니다.

1
2
3
4
5
6
7
8
struct rkusb_hcd_cfg { 
bool enable; //확장 기능을 위해 예약되어 있으며 기본값은 True이며 수정이 필요하지 않습니다.
void* regbase; //UBOOT 관리자가 작성한 기본 주소 등록
int gpio_vbus; //회로 구성에 따라 사용자가 입력하는 USB 전원 공급 장치 제어 GPIO
char *name; //UBOOT 유지 보수 담당자가 입력 한 컨트롤러 이름
void (*hw_init)(void); //UBOOT 관리자로 채워진 콜백 함수 초기화
void (*hw_deinit)(void); //UBOOT 관리자로 채워진 역 초기화 콜백 기능
};
공유하기