U-Boot 포팅 (6. U-Boot 기능 확장 및 디바이스 드라이버 추가 / 새로운 디바이스 추가하기 (UART, I2C, SPI, GPIO 설정))

2025. 2. 26. 12:27프로그래밍/시스템

새로운 디바이스 추가하기 (UART, I2C, SPI, GPIO 설정)

임베디드 시스템에서 U-Boot는 각종 디바이스(UART, I2C, SPI, GPIO)를 초기화하고 운영체제로 넘기는 역할을 합니다.
새로운 보드에 추가적인 하드웨어(UART, I2C, SPI, GPIO)를 지원하려면 디바이스 트리(DTS), 드라이버 설정, 초기화 코드 수정이 필요합니다.

이 문서에서는 UART, I2C, SPI 디바이스 추가 및 GPIO 초기화 코드 작성 방법을 설명합니다.


1. UART 추가하기

UART(Universal Asynchronous Receiver-Transmitter)는 시리얼 통신을 담당하는 장치로, 부팅 로그 출력 및 디버깅에 필수적입니다.
U-Boot에서 새로운 UART를 추가하려면 DTS, board/, drivers/serial/ 디렉토리를 수정해야 합니다.


🔹 1) DTS(Device Tree)에서 UART 추가

📌 DTS 파일 수정 (arch/arm/dts/myboard.dts)

/ {
    chosen {
        stdout-path = "serial0:115200n8";
    };

    uart0: serial@10000000 {
        compatible = "ns16550";
        reg = <0x10000000 0x1000>;
        clock-frequency = <24000000>;
        current-speed = <115200>;
        status = "okay";
    };
};

stdout-path를 serial0로 설정하여 기본 UART 포트를 지정


🔹 2) board/ 디렉토리에서 UART 초기화 코드 작성

📌 UART 초기화 코드 (board/myboard/myboard.c)

#include <common.h>
#include <dm.h>
#include <serial.h>

int board_init(void)
{
    printf("Initializing UART...\n");
    return 0;
}

UART 초기화 코드 추가 후 U-Boot 빌드 및 실행 테스트


🔹 3) UART 드라이버 활성화

📌 configs/myboard_defconfig에서 UART 활성화

CONFIG_SERIAL=y
CONFIG_BAUDRATE=115200
CONFIG_DEBUG_UART=y

📌 U-Boot 빌드 및 테스트

make myboard_defconfig
make -j$(nproc)

부팅 후 printenv 실행하여 UART 출력 확인 가능


2. I2C 및 SPI 디바이스 드라이버 추가

I2C(Inter-Integrated Circuit) 및 SPI(Serial Peripheral Interface)는 센서, EEPROM, 디스플레이 등과의 통신을 위한 프로토콜입니다.
U-Boot에서 I2C 및 SPI를 추가하려면 DTS 파일 수정 및 드라이버 활성화가 필요합니다.


🔹 1) DTS(Device Tree)에서 I2C 및 SPI 추가

📌 DTS 파일 수정 (arch/arm/dts/myboard.dts)

&i2c0 {
    status = "okay";
    clock-frequency = <100000>;

    eeprom@50 {
        compatible = "at24,24c32";
        reg = <0x50>;
    };
};

&spi0 {
    status = "okay";
    cs-gpios = <&gpio 10 GPIO_ACTIVE_LOW>;

    flash@0 {
        compatible = "spi-nor";
        reg = <0>;
        spi-max-frequency = <50000000>;
    };
};

I2C(EEPROM) 및 SPI(Flash) 디바이스 추가


🔹 2) configs/myboard_defconfig에서 I2C 및 SPI 활성화

📌 I2C 및 SPI 설정 추가

CONFIG_CMD_I2C=y
CONFIG_CMD_SPI=y
CONFIG_DM_I2C=y
CONFIG_DM_SPI=y
CONFIG_SYS_I2C_SPEED=100000
CONFIG_SYS_SPI_CLK=50000000

이제 U-Boot에서 i2c 및 spi 명령어 사용 가능

📌 U-Boot 빌드 및 테스트

make myboard_defconfig
make -j$(nproc)

🔹 3) I2C 및 SPI 디바이스 확인

📌 I2C 디바이스 검색

i2c dev 0
i2c probe

📌 SPI 플래시 정보 확인

sf probe

I2C 및 SPI 디바이스가 정상적으로 인식되는지 확인 가능


3. GPIO 초기화 코드 작성

GPIO(General Purpose Input/Output)는 버튼, LED, 센서 등의 디지털 신호 제어에 사용됩니다.
U-Boot에서 GPIO를 설정하려면 DTS 및 드라이버 코드 추가가 필요합니다.


🔹 1) DTS(Device Tree)에서 GPIO 추가

📌 DTS 파일 수정 (arch/arm/dts/myboard.dts)

&gpio {
    status = "okay";

    led {
        label = "myboard:led";
        gpios = <&gpio 5 GPIO_ACTIVE_HIGH>;
    };

    button {
        label = "myboard:button";
        gpios = <&gpio 6 GPIO_ACTIVE_LOW>;
    };
};

GPIO 5번(LED), GPIO 6번(버튼) 추가


🔹 2) GPIO 드라이버 활성화

📌 GPIO 기능 활성화 (configs/myboard_defconfig)

CONFIG_CMD_GPIO=y
CONFIG_DM_GPIO=y
CONFIG_GPIO=y

📌 U-Boot 빌드 및 테스트

make myboard_defconfig
make -j$(nproc)

🔹 3) GPIO 상태 확인 및 제어

📌 GPIO 상태 확인

gpio status

📌 GPIO 5번(LED) ON/OFF 제어

gpio set 5
gpio clear 5

📌 GPIO 6번(버튼) 입력 확인

gpio input 6

GPIO가 정상적으로 동작하는지 확인 가능


📌 정리

UART 추가: DTS 수정 및 bootargs 설정
I2C 및 SPI 추가: EEPROM, SPI-Flash 설정 및 i2c probe, sf probe 테스트
GPIO 초기화: DTS 설정 및 gpio 명령어를 통한 상태 확인