Developer Document

Embedded Software 개발을 하면서 습득한 내용을 적은 시니어 개발자들의 글

코 독 코 독 CoderDocument

전체 글 37

Linux Camera Driver - QBUF/DQBUF와 Video Buffer의 동작 원리

앞선 글에서는 VIDIOC_STREAMON()이 호출된 이후 Camera Streaming이 어떻게 시작되는지 살펴봤다. 그렇다면 DMA가 실제 영상 데이터를 저장할 Memory Buffer는 누가 준비하고 관리하는 것일까? Camera는 Sensor에서 계속 Frame이 들어오기 때문에 Frame을 저장할 공간이 필요하다. 예를 들어 1920x1080 영상을 Capture한다고 하면,Frame 0Frame 1Frame 2... 각 Frame을 저장할 Buffer가 필요하다. Linux V4L2에서는 이러한 Video Buffer를 관리하기 위해 videobuf2(VB2) Framework를 사용한다. 이번 글에서는 다음 흐름을 중심으로 살펴보려고 한다.Application ↓VIDIOC_REQBU..

Embedded SW 기초 2026.09.30

Linux Camera Driver - VIDIOC_STREAMON부터 실제 영상 데이터가 들어오기까지

Camera System은 단순히 Sensor Driver가 등록되었다고 해서 영상이 출력되는 것이 아니다.실제로 영상이 나오기 위해서는 Application에서 Streaming을 시작하고, Linux Kernel의 V4L2 / Media Controller / Video Buffer 계층을 거쳐 각 Camera Sub-device가 Streaming 상태로 전환되어야 한다.이번 글에서는 다음 흐름을 중심으로 살펴보려고 한다.1. Camera에서 Streaming이란 무엇인가?Camera Driver를 처음 공부하면 Stream이라는 용어가 자주 등장한다.간단하게 생각하면 Streaming은 Camera가 실제 영상 Frame을 지속적으로 생성하고 전달하기 시작하는 상태 라고 볼 수 있다.예를 들어 C..

Embedded SW 기초 2026.09.28

Linux Camera Driver - Device Tree로 Camera Pipeline 연결하기

이전 글에서는 Linux Camera Sensor Driver가 어떻게 초기화되는지 살펴봤다.하지만 여기서 한 가지 의문이 생긴다.Sensor Driver가 V4L2 Subdev로 등록되었다고 해서 실제 Camera Pipeline이 완성되는 것은 아니다.실제 카메라 시스템에서는 다음과 같이 여러 장치가 연결된다그렇다면 Linux는 각 장치가 어떤 장치와 연결되어 있는지 어떻게 알 수 있을까? 바로 Device Tree의 port / endpoint / remote-endpoint가 이 역할을 한다.1. Device Tree는 왜 필요한가?Device Tree는 Linux Kernel에게 하드웨어 구성을 알려주는 역할을 한다. 예를 들어 Camera Sensor가 I2C Bus에 연결되어 있다면 다음과 ..

Embedded SW 기초 2026.09.22

Linux Camera Sensor Driver 초기화 흐름 - I2C probe()부터 V4L2 Subdev 등록까지

앞선 글에서는 Linux Camera Driver를 이해하기 위해 두 가지 내용을 살펴보았다.첫 번째 글에서는 Linux I2C Framework를 중심으로 i2c_client, i2c_driver, Device Tree, probe()가 어떻게 연결되는가두 번째 글에서는 V4L2 Framework를 중심으로 v4l2_subdev, Entity, Pad, Link, Format, s_stream() 등의 개념 그런데 여기까지 공부하고 나면 한 가지 궁금한 점이 생기는데 I2C Driver와 V4L2 Driver는 실제 Camera Sensor Driver에서 어떻게 연결되는 것일까?Camera Sensor는 I2C를 통해 Register를 설정해야 하고, 동시에 V4L2 Camera Pipeline의 S..

Embedded SW 기초 2026.09.19

Linux V4L2 Camera Driver - v4l2_subdev부터 Media Pipeline까지

앞선 글에서는 Linux I2C Framework를 중심으로 Camera Sensor Driver가 어떻게 I2C Device와 연결되는지 살펴보았다.특히 i2c_client, i2c_driver, Device Tree, probe()를 통해 Linux에서 Camera Sensor를 어떻게 인식하고 제어하는지를 알아보았다. 이번 글에서는 이 중 V4L2 Framework를 중심으로 살펴보려고 한다.Camera Sensor Driver를 개발하다 보면 단순히 I2C Register를 읽고 쓰는 것만으로는 부족하다.Sensor에서 생성한 영상 데이터를 Linux의 Camera Pipeline으로 연결하고,어떤 Resolution을 사용할 것인지어떤 Pixel Format을 사용할 것인지어떤 Frame Rat..

Embedded SW 기초 2026.09.07

Linux I2C Driver - i2c_client부터 probe()까지

앞선 글에서는 I2C의 기본적인 동작 원리에 대해 정리하였다.I2C는 SDA와 SCL 두 개의 신호선을 이용하고, Master가 통신을 시작하여 Slave Address를 전송한 뒤 Read/Write 방향에 따라 데이터를 주고받는다.또한 Pull-up Resistor, START / STOP Condition, ACK / NACK 등의 개념을 살펴보았다.하지만 실제 Embedded Linux 환경에서 I2C Device를 제어할 때는 이러한 I2C Protocol을 Driver에서 직접 구현하지 않는다.Linux Kernel에서는 I2C Subsystem을 제공하고 있으며, I2C Driver는 이 Framework를 통해 I2C Device와 통신한다.이번 글에서는 Hardware Level의 I2C..

Embedded SW 기초 2026.09.02

MCU - 타이머/카운터

Timer/Counter용도- 시간 및 펄스 폭 측정- 외부 event count- PWM(Pulse Width Modulation) 펄스 발생- 주기적인 인터럽트 발생 종류8bit 타이머/카운터 : 0x00 ~ 0xFF까지 카운트가 가능하다.16bit 타이머/카운터 : 0x0000 ~ 0xFFFF까지 카운트가 가능하다. 동작회로에서 입력으로 clock 신호가 들어오면 clock이 발생한 개수를 count한다. 타이머/카운터 차이타이머는 mcu 내부 clock을 입력으로 사용카운터는 외부 clock을 입력으로 사용 사용1. 일정 시간마다 동작되어야 하는 경우    주기적으로 오버플로우가 발생하도록 하여 오버플로우가 발생한 경우, 특정 동작을 수행하도록 설계된다.2. 모터 동작    PWM 펄스를 생성하여..

Embedded SW 기초 2024.07.08

MCU - 인터럽트 (3)

MCU - 인터럽트 (2)https://coderdocument.tistory.com/entry/MCU-%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8-2 외부 인터럽트앞 장에서 서술한 ( 인터럽트 조건 발생 시에만 관련 플래그 트리거 )에 해당하는 종류이다.이는 입력 펄스의 변화를 감지하여 인터럽트가 발생한다. 입력 펄스의 인터럽트 설정1. 입력 펄스의 edge 트리거 방식- 상승 에지 발생 : level이 low에서 high로 변경될 때- 하강 에지 발생 : level이 high에서 low로 변경될 때- 에지 발생 (상승, 하강) : level이 변경될 때2. 입력 펄스의 level 트리거 방식- HIGH 입력 : level이 high일 때- LOW 입력 : level이 low일 때..

Embedded SW 기초 2024.07.08

MCU - 인터럽트 (2)

MCU - 인터럽트 (1)https://coderdocument.tistory.com/entry/MCU-%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8 - 인터럽트 우선 순위인터럽트는 비동기적으로 발생하기 때문에 여러 개가 인터럽트를 요청하는 경우가 발생할 수 있다.이 경우, 마이크로컨트롤러는 한번에 여러 개의 인터럽트를 처리할 수 없기 때문에 순차적으로 처리할 필요가 있다.순차적으로 처리하기 위해 인터럽트의 우선순위를 정하게 된다. 우선순위는 마이크로컨트롤러 내부에 미리 결정되어 있으며, 미리 결정된 인터럽트 우선 순위를 변경하기 위해서는 인터럽트 우선순위를 지정하는 레지스터를 변경하면 된다.마이크로컨트롤러에 따라 우선순위가 정해져 있어 변경하지 못하는 경우도 존재한다. - 인터럽트 ..

Embedded SW 기초 2024.07.01

MCU - 인터럽트 (1)

인터럽트인터럽트란, 프로그램이 수행되고 있는 동안에 어떤 조건이 발생하여 수행 중인 프로그램을 일시적으로 중지하게 만드는 조건이나 사건의 발생을 의미한다.인터럽트는 사건에 대해 비동기적으로 반응한다. 인터럽트 프로그램 실행 과정  마이크로컨트롤러가 프로그램을 실행하는 과정은 한번에 하나의 명령어만 처리할 수 있다.그러므로 인터럽트가 발생하면 현재 수행하던 Main 프로그램을 일시 중단하고 인터럽트 처리를 위한 ISR 프로그램을 수행한 후, 다시 원래 Main 프로그램으로 복귀하는 구조로 이루어진다. Main Program이 비동기적으로 발생한 event에 대해 반응하여 프로그램을 수행할 수 있다.이처럼 비동기적인 event에 대응하여 인터럽트를 처리하는 프로그램을 인터럽트 서비스 루틴 (Interrupt..

Embedded SW 기초 2024.07.01