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 명령어를 통한 상태 확인
'프로그래밍 > 시스템' 카테고리의 다른 글
U-Boot 포팅 (7. U-Boot 디버깅 및 문제 해결 / JTAG 디버깅) (0) | 2025.03.05 |
---|---|
U-Boot 포팅 (7. U-Boot 디버깅 및 문제 해결 / U-Boot 디버깅 방법) (0) | 2025.03.05 |
U-Boot 포팅 (6. U-Boot 기능 확장 및 디바이스 드라이버 추가 / U-Boot 환경 변수 설정) (0) | 2025.02.26 |
U-Boot 포팅 (5. 디바이스 트리(DTS) 및 환경 변수 설정 / U-Boot 환경 변수 설정) (0) | 2025.02.26 |
U-Boot 포팅 (5. 디바이스 트리(DTS) 및 환경 변수 설정 / 디바이스 트리(Device Tree)란?) (0) | 2025.02.26 |