본문 바로가기

임베디드 개발/리눅스 디바이스 드라이버18

TCA9538 데이터시트 및 리눅스 드라이버 분석 (Tested on Raspberry Pi 4) 데이터시트 분석 TCA9538은 I2C 및 SMBus를 지원하는 8채널 I/O Expander이다. 1. 주요 특징 주요 기능은 I2C to Parallel Port 확장 기능Open-Drain Active Low 인터럽트 출력 기능 제공Active Low 리셋 입력 기능 제공공급 전압 : 1.65V~5.5V5V tolerant I/O 포트최대 400kHz(Fast Mode)의 I2C 통신 속도 지원전원 공급 시 기본적으로 모든 채널이 Input으로 설정됨2개의 하드웨어 주소 핀(A0, A1)을 통해 최대 4개의 디바이스 연결 가능전원 인가 시 글리치 없음SCL/SDA 라인에 노이즈 필터 존 2. 블락 다이어그램 3. 핀아웃 4. 제어 방법1) Supported I2C ModeSt.. 2025. 4. 17.
TCA9548A 데이터시트 및 리눅스 드라이버 분석 (Tested on Raspberry Pi 4) TCA9548A 데이터시트 분석 TCA9548A는 TI사의 8채널 I2C MUX(Multiplexer)로 하나의 I2C 마스터 버스를 통해 최대 8개의 하위 I2C 장치를 연결할 수 있게 해주는 칩이다. I2C는 원래 멀티드롭 토폴로지라서 여러 슬레이브 장치를 하나의 버스에 연결할 수 있는데도 불구하고 이런 MUX가 필요한 이유는? 주로 동일한 주소를 가진 센서를 여러가 사용해야할 경우 이런 I2C MUX를 사용해 채널을 전환하여 장치를 구분한다. 1. 주요 특징 1:8 양방향 I2C 스위치 구조I2C 및 SMBus 호환3개의 주소 핀으로 한 I2C 버스에 최대 8개의 TCA9548A 칩 연결 가능Active-low RESET 핀을 통한 시스템 초기화 및 복구 기능I2C 명령을 통해 원하는 채널을 .. 2025. 4. 6.
LDD ] Device Tree (DT, 디바이스 트리) 디바이스 트리 디바이스 트리(Device Tree, DT)란 하드웨어의 구조와 특성을 운영체제나 소프트웨어가 이해할 수 있도록 기술한 데이터 구조이다.이전에는 커널 소스에 하드웨어 정보를 하드코딩하는 방식이었다면 디바이스 트리 파일의 등장으로 인해 다양한 하드웨어를 단일 커널 이미지로 지원할 수 있게 되었다. 이로 인해 코드 중복이 줄어들고 유지보수성이 향상되는 이점이 있다. 디바이스 트리의 주요 목적은 다음과 같다.플랫폼 식별 : 커널이 실행 중인 플랫폼(보드)의 하드웨어 구조와 자원을 설명하여 플랫폼에 맞는 초기화 과정을 수행할 수 있도록 함디바이스 등록 : 디바이스 트리 데이터를 파싱하여 커널 내부 데이터 구조를 생성하고 디바이스 드라이버로 전달함 디바이스 트리의 계층적 작성 및 재사용.. 2025. 3. 27.
LDD ] PCIe 디바이스 드라이버 작성하기 - (4) with sysfs 이번 글 역시 PCIe 디바이스를 다루는 것보다 디바이스 드라이버 작성 방식에 대해 초점을 맞추도록 한다.   디바이스 드라이버 with sysfs 직전 글에서 사용한 코드를 약간 수정하여 sysfs 인터페이스를 구현하는 디바이스 드라이버를 작성해보도록 하자.  sysfs란?sysfs는 커널 객체(Kernel Object, kobject) 및 해당 객체의 속성 정보(attribute)를 사용자 공간에 노출하는 파일 시스템을 말하며, /sys 디렉토리에 마운트된다. sysfs에서 커널 객체(kobject)는 디렉토리를 나타내고, 속성(attribute)는 디렉토리 내의 파일로 표현되어 해당 객체의 상태 정보 또는 설정값을 제공한다. 그리고 리눅스 커널의 디바이스(struct device)와 드라이버(str.. 2025. 3. 18.
LDD ] 커널 메모리 할당 함수 (kmalloc, kzalloc 등) kmalloc / kzallockmalloc과 kzalloc은 커널 공간에서 연속된 메모리를 동적으로 할당하는 함수로, 사용자 공간의 malloc, calloc과 유사하지만 커널 내부에서만 사용된다. 참고로 이 두 함수로 할당 가능한 최대 메모리 크기는 시스템의 page size에 의존하며, 일반적인 page size인 4KB보다 작은 크기의 객체를 할당할 때만 사용하는 것이 권장된다. 만약 4KB 이상의 메모리를 할당하려면 vmalloc 등 다른 메모리 할당 함수를 사용해야 한다. 한편 이 두 함수를 사용에 할당된 메모리는 사용이 끝나면 반드시 kfree를 통해 해제하여 메모리 누수를 방지해야 한다. kmalloc과 kzalloc의 차이는 다음과 같다.kmalloc : 할당된 메모리는 초기화되지 않는다.. 2025. 3. 12.
LDD ] PCIe 디바이스 드라이버 작성하기 - (3) with Interrupt 이번 글에서는 PCIe 디바이스를 다루는 것보다 디바이스 드라이버 작성 방식에 대해 초점을 맞추도록 한다.  디바이스 드라이버 with 인터럽트  직전 글에서 사용한 코드를 약간 수정하여 디바이스 드라이버에서 인터럽트를 핸들링하는 방법을 알아보도록 하자.2024.11.29 - [임베디드 개발/리눅스 디바이스 드라이버] - LDD ] PCIe 디바이스 드라이버 작성하기 - (2) 하드웨어 장치는 특정 작업을 완료하거나 상태가 변경될 때 CPU에 인터럽트를 발생시켜 처리를 요청하는데 이를 IRQ(Interrupt Request)라고 한다. 그리고 디바이스 드라이버는 인터럽트가 발생했을 때 호출될 IRQ 핸들러를 등록하여 인터럽트를 처리할 수 있다. 이번 목표는 PSR 레지스터를 타이머를 사용해서 폴링으로 체.. 2025. 3. 3.
LDD ] 커널 시간 관련 함수 사용법 1. HZ와 jiffies HZ초당 발생하는 타이머 인터럽트의 수를 나타내는 상수로, 플랫폼마다 다르지만 일반적으로 250으로 설정된다.  jiffies커널에서 사용하는 시간 단위의 전역 변수로, 부팅 이후 매 타이머 인터럽트마다 1씩 증가하는 tick 카운터이다. 즉, jiffies는 초당 HZ의 수 만큼 증가하며, HZ가 250으로 설정된 경우 1 jiffy는 1 / HZ = 1 / 250 = 4ms이다.  현재 시스템의 HZ 값을 터미널에서 확인하는 법현재 실행 중인 커널의 컴파일 시 설정 정보는 /boot/config-$(uname -r) 이름으로 파일시스템에 노출되는데, 해당 파일에서 다음 명령을 통해 HZ 설정값을 확인할 수 있다. grep CONFIG_HZ /boot/config-$(unam.. 2025. 2. 27.
Linux Kernel ] Container_of Container_ofContainer_of는 리눅스 커널에서 매우 유용하게 자주 쓰이는 매크로로 구조체 멤버의 포인터로부터 해당 멤버가 속한 구조체의 시작 주소를 얻는데 사용된다.  Container_of 매크로의 정의는 다음과 같으며, 인자로 '구조체 멤버의 포인터', '전체 구조체의 타입', '구조체 멤버의 이름'을 받고 '전체 구조체의 시작 주소'를 반환한다. #define container_of(ptr, type, member) ({ \ void *__mptr = (void *)(ptr); \ static_assert(__same_type(*(ptr), ((type *)0)->member) || \ __same_type(*(ptr), void), \ "p.. 2025. 2. 6.
Linux Kernel ] Error Handling 커널의 에러 코드 정의 리눅스 커널에서 사용되는 에러 코드들은 아래 파일들에 정의되어 있다.- include/uapi/asm-generic/errno-base.h- include/uapi/asm-generic/errno.h errno-base.h 파일은 기본 에러 코드들을 정의하며, error.h 파일은 errno-base.h 파일을 포함하며 추가적으로 아키텍처나 환경에 따라 확장된 에러 코드를 제공한다. errno-base.h/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */#ifndef _ASM_GENERIC_ERRNO_BASE_H#define _ASM_GENERIC_ERRNO_BASE_H#define EPERM 1 /* Operatio.. 2025. 2. 3.
Device tree compiler 사용법 Device tree compiler는 Device tree 파일을 컴파일/디컴파일하기 위한 도구로 아키텍처에 종속되지 않는 독립적인 표준을 따른다.  1. 설치 방법$ sudo apt update$ sudo apt install device-tree-compiler   2. 사용법 (dts ↔ dtb/dtbo) 1. 기본 사용법# dtc -I -O -o    2. DTB → DTS  변환 (디컴파일)# dtb -> dts 디컴파일$ dtc -I dtb -O dts -o extracted.dts source.dtb   3. DTS → DTB 변환 (컴파일)# dts -> dtb 컴파일$ dtc -I dts -O dtb -o compiled.dtb source.dts   4. -@ 옵션 (DTS → .. 2025. 1. 27.