Linux
-
디바이스 드라이버 / LED 제어Linux/Linux Device Driver 2020. 9. 1. 12:44
디바이스 드라이버로 하드웨어를 제어하기 전에 응용프로그램에서 하드웨어를 제어하여 LED를 출력해보자. 응용프로그램에서 GPIO를 제어하여 LED를 제어하는 방법 첫 번째 방법은 wiringPi 라이브러리를 이용하는 방법이다. 몇 번핀을 쓸 것인지만 정하고 적절한 함수에 해당 핀 번호를 매개변수로 넘겨주면 알아서 제어가 된다. 실제로 핀 설정하기전에 wiringPiSetup()이라는 함수가 수행되는데 이 함수를 보면 세 번째 방법에서 수행하는 GPIO를 제어할 수 있는 메모리 영역을 mmap함수(매핑)를 수행한다. wiringPi 라이브러리를 사용하여 생각할게 없고 쉽다. 하지만 공부에는 전혀 도움이 안돼서 안 썼다.매핑도 직접해봐야 공부가 된다. 두 번째 방법은 /sys/class/gpio를 이용하는 방..
-
디바이스 드라이버 / 부 번호에 의한 파일 처리Linux/Linux Device Driver 2020. 9. 1. 12:41
부 번호에 의한 파일 처리는 register_chrdev() 함수를 사용해야 합니다. 그럼 register_chrdev() 함수를 사용하는 이유는 뭘까요? 바로 부 번호로 제어를 하기 위해서는 디바이스 파일과 1:N으로 대응해야 하기 때문입니다. pi@raspberrypi:~/Documents/minor $ nano minor_driver.c #include #include #include #include // file_operations 포인터 함수 #include // copy_to_user() #include // kmalloc() #define MAJOR_DEV_NAME "major_dev" #define MAJOR_DEV_NUM 200 static int minor1_open(struct ino..
-
디바이스 드라이버 / 주 번호에 의한 파일 처리Linux/Linux Device Driver 2020. 9. 1. 12:41
주 번호에 의한 파일 처리는 register_chrdev()와 register_chrdev_region() 두 가지 함수를 사용할 수 있습니다. pi@raspberrypi:~/Documents/major $ nano major_driver.c #include #include #include #include // file_operations #include // copy_to_user() #include // kmalloc() #define MAJOR_DEV_NAME"major_dev" #define MAJOR_DEV_NUM200 static int major_open(struct inode *inode, struct file *file) { printk("major_open\n"); return 0; }..
-
디바이스 드라이버 / 메모리 풀Linux/Linux Device Driver 2020. 9. 1. 12:40
pi@raspberrypi:~/Documents/mempool $ nano mempool.c #include #include #include #include #include #define MIN_ELEMENT 2; #define TEST_ELEMENT 4; typedef struct { int number; char string[128]; }TMemElement; int elementcount = 0; void* mempool_alloc_test(unsigned int gfp_mask, void* pool_data) { TMemElement* data; printk("----> call mempool_alloc_test\n"); data = kmalloc(sizeof(TMemElement), gfp_ma..
-
디바이스 드라이버 / 동적 메모리 할당Linux/Linux Device Driver 2020. 9. 1. 12:40
kmalloc() 연속된 물리 메모리를 연속된 가상 공간에 매핑하여 할당 받는다. GFP_KERNEL 플래그는 kmalloc() 함수에서 사용하는 대표적인 인자값으로 동적 메모리 할당이 항상 성공하도록 요구한다. 이 값으로 kmalloc() 함수를 사용하면 커널이 관리하는 메모리가 충분하지 않을 경우에는 디바이스 드라이버를 호출한 프로세스가 수행을 멈추고, 동적 메모리를 할당할 수 있는 상태가 될 때까지 잠든다. 그러다 다른 프로세스에서 메모리를 반환해 커널이 동적 메모리를 할당할 수 있는 상태가 되면 깨어난다. 그래서 kmalloc() 함수를 인터럽트 서비스에서 사용할 때는 이 값을 사용하면 안된다. GFP_ATOMIC 플래그를 사용하는 경우 슬립되지 않으므로 인터럽트 핸들러에서도 사용될 수 있다. v..
-
디바이스 드라이버 / 매개변수 지정Linux/Linux Device Driver 2020. 9. 1. 12:39
pi@raspberrypi:~/Documents/param $ nano param.c #include #include #include #include static short param1 = 0; static unsigned short param2 = 0; static int param3 = 0; static unsigned int param4 = 0; static long param5 = 0; static unsigned long param6 = 0; static char* param7 = NULL; module_param(param1, short, 0); module_param(param2, ushort, 0); module_param(param3, int, 0); module_param(param4,..
-
디바이스 드라이버 / 개발 시 고려사항Linux/Linux Device Driver 2020. 9. 1. 12:38
변수 지역 변수와 전역 변수의 선택 다비아스 드라이버는 다중 프로세스 환경에서 동작하기 때문에 프로세스간 변수 사용에 따른 경쟁 문제(동기화 문제)를 해결하기 위해 가급적 지역 변수를 사용하는 편이 좋다. 그러나 디바이스 드라이버가 커널에 적재되고 해제되는 시점까지 유지해야하는 정보라면 전역 변수로 지정해야 한다. 중복 함수명과 변수명 방지 리눅스 커널은 많은 함수와 전역 변수가 있다. 그래서 새로 추가되는 디바이스 드라이버 소스에서 사용되는 함수와 변수가 중복될 수 있다. 모듈로 작성되는 경우라면 심볼 테이블에 의해 관리되기 때문에 중복으로 인해 문제가 발생할 확률이 적어지지만, 커널 소스에 포함시키는 경우라면 심각한 문제가 발생할 수 도 있다. 그러므로 이를 미연에 방지하기 위해 함수나 변수에 sta..
-
디바이스 드라이버 / 동작 과정Linux/Linux Device Driver 2020. 9. 1. 12:37
디바이스 드라이버는 시스템이 지원하는 하드웨어를 응용프로그램에서 사용할 수 있도록 커널에서 제공하는 라이브러리다. 카메라 모바일 어플리케이션을 개발할 때도 응용프로그래머가 카메라 디바이스 드라이버를 개발하지 않고 시스템 개발자가 만들어 놓은 카메라 디바이스 드라이버를 이용하여 개발하는 것과 같다. 응용 프로그램이 커널에게 자원 처리를 요청하는 방법은 크게 2가지다. 1. 시스템 호출 방식 2. 파일 입출력 방식 하드웨어를 다루기 위해 기존의 시스템 호출 방식과 병행해서 파일 입출력 함수로 하드웨어를 제어하는 개념이다. 수정중..