목록RaspberryPi/DeviceDriver (11)
행복한 하루
안녕하세요. 모듈을 커널에 추가 시 매개변수(Parameter)를 만들어 인수를 받을 수 있도록 해봅니다. 이렇게 하는 것을 모듈을 커널에 추가할 때 특별한 값을 모듈에 내부에 해서 사용할 수 있게 하려고 하는 것입니다. main 함수의 매개변수(argc, argv)와 유사하게 사용하기 위함입니다. 1 모듈 기본 형태 준비 - 이전 내용과 유사하게 드라이버 틀이 만들어진 day1 폴더를 복사해서 수정합니다. pi@raspberrypi:~/DriverStudy $ cp day1 day12_param -r pi@raspberrypi:~/DriverStudy $ cd day12_param pi@raspberrypi:~/DriverStudy $ mv day1_module.c day12_param.c - Make..
안녕하세요. 이전에 내용에서는 단순 GPIO를 이용한 버튼을 확인해 보았습니다. 이번에는 좀 더 정확하게 처리할 수 있는 Interrupt 신호를 가지고 버튼신호를 확인해 보겠습니다. 1. 사전 준비 1) 하드웨어 준비 - 간단한 Tact Switch를 한 개 준비합니다. 그리고 Raspberry Pi 핀 17번에 한쪽을 연결하고 나머지 한쪽은 3.3V(+) 출력 단자를 연결합니다. 2) 소프트웨어 준비 - 이전 내용과 유사하게 드라이버 틀이 만들어진 day1 폴더를 복사해서 수정합니다. pi@raspberrypi:~/DriverStudy $ cp day1 day11_irq_button -r pi@raspberrypi:~/DriverStudy $ cd day11_irq_button pi@raspberry..
안녕하세요. 지난번 Timer를 사용해서 LED제어해 보았는데, 이것보다 좀 더 짧은 주기를 사용가능한 타이머를 확인해보려고 합니다. 고분해능 타이머는 jiffies 단위로 작동하는 타이머와 달리 나노초 단위로 동작시킬 수 있습니다. 조금 상세한 내용은 하단 링크를 참조하면 hrtimer 프레임워크에 대한 내용을 볼 수 있습니다. 1. 사전 준비 - 이전내용과 동일하게 기존에 드라이버 뼈대에 내용을 붙이는 형식으로 합니다. 그래서 처음내용의 소스를 복사해서 이름을 바꾸고 Makefile 내용도 수정해 줍니다. pi@raspberrypi:~/DriverStudy $ cp -r day1 day9_hrTimer pi@raspberrypi:~/DriverStudy $ cd day9_hrTimer/ pi@rasp..
안녕하세요. 이번에는 Timer를 사용하는 방법을 확인해보려고 합니다. 드라이버가 추가되면 LED가 켜지고 타이머가 초기화 4초 초기화되면서 카운트하기 시작합니다. 시간이 되면 LED가 꺼지는 것을 테스트해 봅니다. 1. 하드웨어 연결 - 간단한 점퍼 케이블과 LED 하나 정도만 있으면 됩니다. 안전하게 테스트 위해서는 브래드 보드에 220Ω~330Ω정도 저항 뒤에 LED를 달아서 테스트해야 합니다. - 라즈베리파이의 GPIO 4 핀에는 LED +극(Anode), Ground핀에는 LED -극(Cathode)을 연결합니다. 2. 사전 작업 - 기존에 작업한 것처럼 드라이버 구조가 만들어진 소스를 이용합니다. day1에서 기초 형태를 복사합니다. pi@raspberrypi:~/DriverStudy $ cp..
안녕하세요. 이번에는 I2C 통신을 이용한 리눅스 센서 드라이버를 만들어 봅니다. 그중에 BMP280 제품으로 기압과 온도를 측정하는 센서 드라이버를 만드는 내용입니다. 현재 단독으로 된 BMP280 센서 모듈을 가지고 있지 않아서 Pioneer600에 장착된 BMP280 센서로 테스트를 진행하였습니다. 개별적으로 가지고 있다면 I2C 배선만 동일하면 문제없이 테스트할 수 있습니다. 그리고 참조 유튜브에서는 컴파일하기 전에 내용이 끝나서 최종 작업과 온도 확인하는 애플리케이션을 만드는 내용을 추가했습니다. 1. BMP280 센서와 연결하기 - BMP180은 가지고 있어서 연결하는 방법만 참조하는 겸 사진을 첨부하였습니다. 만약 개별적 BMP280 센서가 있다면 동일하게 아래와 같이 연결하면 됩니다. 보통..
안녕하세요. 이번 내용은 기존의 GPIO에서 발전된 PWM 기능을 사용해보려고 합니다. 예전 내용에도 PWM 제어가 있지만, Driver 차원이 아니라, 응용프로그램 단에서 사용해본 것이었습니다. PWM의 경우에도 하드웨어서 지원하느냐, 소프트웨어상 구현하느냐에 따라서 주기 등 차이가 발생하기도 합니다. 여기서는 하드웨어에서 PWM 지원해주는 핀을 이용해서 작동시키는 것을 테스트합니다. 1. 사전 준비 - 기존의 GPIO4 내용을 복사해서 사용합니다. - Makefile 파일에서 파일 수정 pi@raspberrypi:~/DriverStudy/day6_pwm $ vim Makefile 2. 소스 수정 1) 소스 수정에 필요한 PWM 함수 확인 (1) struct pwm_device * pwm_request..
안녕하세요. 이번 내용은 Character LCD 제어하는 드라이버를 만드는 내용입니다. 참조 사이트 동영상에는 HD44780 제품을 사용하는 내용인데, 제가 테스트한 것은 조금 다른 제품이지만, 기본적인 CLCD 제어하는 칩이 비슷하다 보니 명령어가 동일하게 작동하였습니다. 2x16 CLCD를 가지고 있다면 핀 맵을 보시고 테스트하시면 됩니다. 그러나 현재 제품은 데이터 8핀을 사용하는 제품이므로 선 연결이 조금 깔끔하지 않을 수 있습니다. 1. 사전 준비 - CLCD 제어도 GPIO 기반이기 때문에 기존 내용을 사용하도록 합니다. - 이전에 내용인 day4_gpio 디렉터리를 day5_clcd로 복사를 합니다. pi@raspberrypi:~/DriverStudy $ cp -r day4_gpio day..
안녕하세요. 이번에는 GPIO(general-purpose input/output) 드라이버 제작해보겠습니다. 간단하게 작은 LED를 준비합니다. 그리고 버튼 구하기가 조금 어려우니 그냥 케이블을 연결해서 확인하는 것으로 테스트해보았습니다. 1. 사전 준비 - 이전에 했던 day3 디렉터리를 day4_gpio로 복사를 합니다. pi@raspberrypi:~/DriverStudy $ cp -r day3 day4_gpio - 기본의 파일 이름을 작업하기 위한 파일로 바꿉니다. 그리고 Makefile의 obj 파일 리스트에서도 바꿔줍니다. pi@raspberrypi:~/DriverStudy/day4_gpio $ mv read_write.c gpio_driver.c pi@raspberrypi:~/DriverSt..
안녕하세요. 디바이스 드라이버가 일을 하도록 간단한 작업을 시켜보도록 하겠습니다. 그리고 이전에 장치 번호를 수동으로 입력했는데, 이번에는 알아서 장치 번호가 생성되도록 하는 내용입니다. 1. 사전 준비 - 이전에 했던 day2 디렉터리를 day3으로 복사를 합니다. pi@raspberrypi:~/DriverStudy $ cp -r day2 day3 pi@raspberrypi:~/DriverStudy $ cd day3 - 작업하려는 내용에 맞게 파일 이름을 바꿉니다. 그리고 Makefile의 내용도 변경해줍니다. pi@raspberrypi:~/DriverStudy/day3 $ mv dev_nr.c read_write.c pi@raspberrypi:~/DriverStudy/day3 $ vim Makefil..
안녕하세요. 이전 내용에서 디바이스 드라이버 소스의 간단한 형태를 잡아 보았다면 이번에는 디바이스에 장치 번호를 할당해서 접근하는 방법을 알아보도록 하겠습니다. 커널 레벨, 유저 레벨 등의 이론적인 내용은 아주 간략하게 설명했고, 실습 위주로 정리해보았습니다. 1. 사전 준비 이전 파일을 좀 더 디바이스 같은 느낌(?)으로 파일 이름을 변경합니다. (작업하는 디렉터리 이름은 day2로 변경했습니다. pi@raspberrypi:~/DriverStudy/day2 $ mv day1_module.c dev_nr.c 그러면 Makefile도 같이 내용을 수정해줍니다. obj-m += dev_nr.o 2. 디바이스 드라이버 소스 수정 pi@raspberrypi:~/DriverStudy/day2 $ vim dev_n..
안녕하세요. 라즈베리 파이를 사용하면서 여러 장치들 제어하기 위해서 메인 소스상에서 추가해서 사용했는데, 그것이 아니라 필요에 따라서 등록하고 해제해서 사용할 수 있도록 디바이스 드라이버 모듈로 만들어 보면 좋겠다 생각하였습니다. 그리고 외국분이 작업한 내용이 있어서 참조하면서, 확인해보도록 하겠습니다. 샘플 예제는 Raspberry Pi 3이지만 현재 작업하는 환경은 Raspberry Pi 4 bullseye 32bit에서 테스트 진행하였습니다. 참고로, 라즈베리 파이 전용 디바이스 드라이버라고 하기는 그렇고, 하드웨어 핀과 같은 특정 부분을 제외하면 리눅스 디바이스 드라이버라고 생각해도 될 것 같습니다. 1. 개발에 필요한 프로그램 설치 - 디바이스 드라이버 개발에 필요한 커널 헤더와 드라이버 소스를..