반응형

Embedded System 90

Linux 커널 디버깅 가이드: dmesg, gdb, kgdb, ftrace 완벽 활용법

임베디드 리눅스 커널 디버깅이 필수적인 이유 (작성 배경 및 취지)임베디드 리눅스 커널 개발 중 발생하는 커널 파닉(Kernel Panic), 널 포인터 참조(Null Pointer Dereference), 메모리 릭(Memory Leak) 및 시스템 멈춤 현상은 복잡한 시스템 구조로 인해 문제 원인을 파악하기 어렵습니다. 64비트 ARMv8 (AArch64) SoC 플랫폼에서는 하드웨어 인터럽트, 타이머, 메모리 관리 장치(MMU)와 커널 모듈이 밀접하게 결합되어 있어 정교한 분석 도구가 필수적입니다.본 포스팅에서는 타겟 보드에서 발생할 수 있는 커널 문제 해결을 위해 필수적으로 사용되는 디버깅 기법인 dmesg, printk, gdb, kgdb, ftrace의 동작 원리와 실무 적용 전략을 다룹니다...

임베디드 리눅스 DMA Driver 구현: dma_map_single 버그 수정 및 dmaengine API 메모리 복사 예제

임베디드 리눅스 DMA (Direct Memory Access) 개발 배경 및 중요성임베디드 리눅스 시스템에서 대용량 데이터 전송 시 CPU가 직접 I/O 메모리에 접근하면 높은 CPU utilization 및 Latency가 발생합니다. DMA(Direct Memory Access) Controller를 활용하면 CPU Intervention 없이 Memory-to-Memory, Memory-to-Peripheral 간 데이터 전송이 가능합니다.기존 개발 과정에서 발생하던 dma_map_single() 버퍼 불일치 오류 및 API 호출 순서 문제를 바로잡고, Linux Kernel dmaengine Subsystem 기반의 올바른 메모리 매핑 및 전송 구현법을 서술합니다.Linux Kernel dmae..

임베디드 리눅스 커널 GPIO IRQ 드라이버 구현 및 Interrupt Handling 최적화 가이드

임베디드 리눅스 시스템 환경에서 GPIO Interrupt Handling 구현 배경 및 목적임베디드 리눅스(Embedded Linux) 시스템에서 하드웨어 이벤트를 실시간으로 처리하기 위해 GPIO 인터럽트 드라이버 구현은 필수적입니다. 주기적인 하드웨어 상태 확인을 위해 폴링(Polling) 방식을 사용하는 것은 CPU 자원 소모를 극대화하고 응답 지연(Latency)을 유발합니다.본 기술 포스팅에서는 ARM GIC(Generic Interrupt Controller) 아키텍처 환경에서 SoC의 GPIO 컨텍스트 인터럽트를 제어하는 커널 드라이버 구조를 설명합니다. 기존 구형 레거시 API(gpio_request, request_irq) 방식의 오류를 바로잡고, 최신 커널 Standard인 gpiod..

임베디드 리눅스 USB HID 터치 드라이버 개발 및 URB Interrupt IN 처리 가이드

임베디드 리눅스 환경에서 USB HID Touch Driver 개발이 필요한 이유임베디드 리눅스 시스템 기반의 산업용 디바이스 또는 스마트 터치 디스플레이 제품을 개발할 때, USB 인터페이스 기반의 터치 패널 연동은 핵심적인 과제 중 하나입니다. USB Subsystem은 핫플러깅(Hot-plugging) 및 다양한 전송 방식을 지원하지만, 하드웨어 이벤트를 시스템의 터치 입력으로 변환하려면 임베디드 리눅스 커널의 USB Core 및 Input Subsystem 동작 원리를 명확히 이해해야 합니다.기존 기본 예제 코드는 단순한 Probe 등록 구조만 제시할 뿐, 실무 하드웨어 개발 시 필수적인 URB(USB Request Block) 생성, 비동기 데이터 수신 메모리 할당(usb_alloc_cohere..

Linux TTY Serial Driver 구현: DesignWare 8250 UART 레지스터 제어 및 FIFO/LSR 디버깅

Linux Kernel Serial Driver 개발 배경 및 tty_port/serial_core의 중요성임베디드 리눅스 시스템에서 UART/USART(Universal Synchronous/Asynchronous Receiver-Transmitter)는 시리얼 통신, 디버깅 로그 출력 및 외부 센서 제어에 필수적인 하드웨어 인터페이스입니다. 임베디드 SoC 기반 시스템 개발 과정에서 표준 Linux 8250 시리얼 드라이버 또는 커스텀 serial_core 기반 드라이버를 올바르게 작성하지 않으면, 커널 입출력 병목 현상이나 데이터 유실(Overrun Error)이 발생할 수 있습니다.본 포스팅에서는 Device Tree Source(DTS) 설정부터 platform_driver 및 uart_driv..

Linux SPI Driver 개발 및 NOR Flash Control 가이드 (Device Tree & spi_sync)

Linux SPI Driver 개발 및 NOR Flash Control의 중요성임베디드 리눅스 시스템에서 SPI(Serial Peripheral Interface)는 NOR Flash, OLED Display, 센서 등과의 고속 동기식 통신을 위해 가장 광범위하게 활용되는 프로토콜입니다. 특히 AP 기반의 보드 설계에서는 부팅 펌웨어(U-Boot) 및 중요 시스템 설정을 저장하기 위해 SPI NOR Flash 장치를 빈번하게 사용합니다.그러나 실제 개발 현장에서는 SPI 모드 설정 불일치(SPI Mode Mismatch), DMA 버퍼 정렬 문제, Write Enable(0x06) 명령 누락으로 인한 쓰기 실패 등 다양한 디버깅 난관에 직면하게 됩니다. 본 포스팅에서는 Linux Kernel SPI Su..

Linux Kernel I2C Touch Driver 구현 및 devm_request_threaded_irq 기반 최적화

Rockchip RK3399 임베디드 리눅스 I2C Subsystem 및 Input Subsystem 개요임베디드 리눅스 시스템에서 I2C(Inter-Integrated Circuit) 버스는 터치 스크린, RTC, 가속도 센서, EEPROM 등 다양한 주변 장치를 연결하는 핵심 인터페이스입니다. RK3399와 같은 Arm64 다중 코어 SoC 환경에서는 I2C 컨트롤러 하드웨어를 제어하는 Adapter Driver와 버스에 연결된 슬레이브 디바이스를 제어하는 Client Driver의 명확한 구조적 분리가 필수적입니다.본 포스팅에서는 Rockchip RK3399 SoC 환경에서 Device Tree 노드 작성법부터 시작하여 i2c_driver 구조체를 사용한 터치 입력 장치(Input Device) 드..

Linux Kernel Platform Driver 및 Device Tree (gpio-leds) 완전 가이드(Rockchip RK3399)

Rockchip RK3399 Linux Kernel Platform Driver 개발 배경 및 필요성SoC(System on Chip) 환경에서 하드웨어 제어를 구현할 때 Linux Kernel의 platform_driver 및 Device Tree 구조 이해는 필수적입니다. 본 가이드에서는 Rockchip RK3399 칩셋을 기준으로 gpio-leds 기반의 Device Tree 노드 작성과 platform_driver 구조체를 사용한 Kernel Driver 구현 프로세스를 다룹니다. 기존 코드의 devm_gpiod_get 레이블 매칭 오류를 수정하고, GPIO Subsystem과의 정상적인 연동 방식을 명확히 제시합니다.RK3399 Platform Driver 핵심 구현 요약Device Tree c..

임베디드 리눅스 sysfs 드라이버 구현: kobject_create_and_add() 및 sysfs_create_file() 최적화 가이드

시스템 환경에서 Linux Kernel sysfs 인터페이스 구축 배경임베디드 리눅스 시스템(예: Rockchip RK3399 SOC)에서 커널 공간(Kernel Space)과 사용자 공간(User Space) 간의 데이터를 교환하는 것은 매우 중요합니다. sysfs는 Linux 커널 2.6부터 도입된 가상 파일 시스템(Virtual File System)으로, /sys 디렉토리 아래에 kobject 트리를 시각적으로 표현합니다.보드 개발 시, 단순 제어나 상태 모니터링을 위해 ioctl이나 character device를 전체 구현하는 것은 비효율적일 수 있습니다. sysfs 속성(Attribute)을 생성하면 cat 및 echo 명령어만으로 디바이스 제어, GPIO 상태 관리, CPU 주파수 설정 등..

임베디드 리눅스 캐릭터 디바이스 드라이버(Character Device Driver) 기초 및 구현

임베디드 리눅스 환경에서 가동되는 수많은 센서, 디스플레이, 시리얼 통신 장치들은 커널 공간에서 저마다의 드라이버 형태를 취하며 사용자 공간과 소통합니다. 그중 가장 기본적이면서도 빈번하게 사용되는 아키텍처가 바로 캐릭터 디바이스 드라이버(Character Device Driver)입니다. 리눅스의 대원칙인 '모든 것은 파일이다(Everything is a file)'를 가장 직관적으로 보여주는 서브시스템으로, 사용자 애플리케이션의 파일 제어 시스템 콜이 어떻게 실제 커널 내부 메모리 영역으로 연결되는지 그 개념과 소스코드 구현, 가상 노드 테스트 절차를 명확하게 짚어보겠습니다.핵심 요약 3줄캐릭터 디바이스 드라이버는 데이터를 바이트(Byte) 단위의 스트림 형태로 순차 처리하는 커널 모듈 인터페이스입니..

반응형