본문 바로가기
반응형

Linux BSP47

[Linux Device Driver] Timer Interrupt 리눅스와 같은 운영체제의 핵심 기능은 스케줄링인데, 이를 위해 핵심적인 것이 타이머 인터럽트이다. 리눅스 커널에서는 이를 위해 HZ라는 상수 값을 초기에 설정하고 잇따. HZ라는 상수값을 통해 타이머 인터럽트가 발생하는 주기가 설정되면, 커널은 이 값으로 각 프로세스의 동작 시간을 체크하여 스케줄링 한다. 이때 프로세스의 동작시간을 체크 할 수 있는 기준값이 필요한데, 이때 리눅스 커널은 jiffies_64(커널 2.4에서는 jiffies)라는 전역변수를 통해 커널 전체에 동일한 기준 시간값을 제공한다. jiffies 값이 1초당 100씩 증가한다. 고로, 10ms마다 jiffies 값이 증가하는거고, 그에 맞게 계산하여 1초마다 실행시키고 싶으면 jiffies가 100이 될 때마다 동작하게 설정하면 되.. 2024. 2. 27.
[Linux Device Driver] Kernel Timer 디바이스 드라이버를 작성하다 보면 하드웨어를 주기적으로 감시하거나 하드웨어를 제어한 이후에 정상적으로 동작하는지 감시하기 위해 정해진 시간이 초과되면 특정 함수를 수행히는 기능이 필요할 때가 많다 이를 위해 리녹스 커널은 커널 타이머라는 기능을 제공하고 있음. 커널 타이머를 디바이스 드라이버에서 사용하기 위해서는 아래의 구조체와 함수를 이용해야함. 구조체 • struct timer_list: 커널 타이머 구조체 함수 • init_timer(): 커널 타이머 구조체를 초기화한다 . • add_timer(): 커널 타이머에 수행될 함수를 등록한다 • del_timer(): 커널 타이머 목록에서 등록된 것을 제거한다. 타이머 동작 timer 구조체를 선언해주고 1) init_timer를 통해 해당 구조체를 초.. 2024. 2. 27.
[Device Driver] 어플리케이션 없이 insmod만으로 동작하는 모듈 프로그램으로 커널 타이머 GPIO제어 이전 글에서 코드를 향상시켜봅니다. [Device Driver] 어플리케이션 없이 insmod만으로 동작하는 모듈 프로그램으로 커널 타이머 인터럽트 어플리케이션 없이 insmod만으로 동작하는 모듈 프로그램으로 커널 타이머 인터럽트 구현 /dev에 등록하는 과정이 없는거임. timerVal를 ubuntu@ubuntu8:~/pi_bsp/drivers/p335_kerneltimer$ vi kerneltimer.c #include #incl program-developers-story.tistory.com ledVal의 값에 따라 led 제어하는 코드 짜봅시다잉 ubuntu@ubuntu8:~/pi_bsp/drivers/p335_kerneltimer_led$ cat Makefile MOD := kerneltim.. 2024. 2. 26.
[Device Driver] 어플리케이션 없이 insmod만으로 동작하는 모듈 프로그램으로 커널 타이머 인터럽트 구현 어플리케이션 없이 insmod만으로 동작하는 모듈 프로그램으로 커널 타이머 인터럽트 구현 /dev에 등록하는 과정이 없는거임. timerVal를 ubuntu@ubuntu8:~/pi_bsp/drivers/p335_kerneltimer$ vi kerneltimer.c #include #include #include #include #include #include #include #include #include #include #include #include #include #define DEBUG 1 static int timerVal = 100; module_param(timerVal,int ,0); static int ledVal =0; module_param(ledVal,int,0); struct ti.. 2024. 2. 26.
[Device Driver] ioctl 함수 ioctl 함수는 read write로 할 수 없는 io control 역할 수행. gpio 제어인데 중간에 입출력이 바뀌는 경우가 있잖슴? gpio 방향 설정이나, alternative 함수를 설정한다던지 하는 경우에 사용하는게 ioctl이다. v4l(vedio for linux) 같은 경우가 ioctl을 사용하는 대표적인 예시임. ioctl 함수의 호출관계 command라는 값은 ioctl의 2번째 매개변수고 매개변수가 0x51 이런식으로 들어오면 2가지로 cmd 검사를 하게됨. unsigned long arg는 구조체의 주소를 넘길 때 포인터로 넘겼는데, long arg로 받는다. 주소값을 상수로 받는거지. 근데 크기정보가 없기 때문에, cmd에 2번째 요소에 자료형의 크기를 넘겨주는거임. 그래서 .. 2024. 2. 26.
[Linux Device Driver] 주번호, 부번호의 개념과 예제 Makefile APP := minor_app MOD := minor_dev SRC := $(APP).c obj-m := $(MOD).o CROSS = ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- CC := arm-linux-gnueabihf-gcc KDIR := /home/ubuntu/pi_bsp/kernel/linux PWD := $(shell pwd) default:$(APP) $(MAKE) -C $(KDIR) M=$(PWD) modules $(CROSS) cp $(MOD).ko /srv/nfs $(APP): $(CC) $(APP).c -o $(APP) cp $(APP) /srv/nfs clean: rm -rf *.ko rm -rf *.mod.* rm -rf .*... 2024. 2. 26.
[Linux Device Driver] application-> 디바이스 드라이버 8바이트 매개변수 입력 저번 예제에는 1byte를 application에 넘겨서 write를 하는 거였는데, 8byte 배열을 넘겨보자. 보통 디바이스 드라이버에서 1바이트만 넘기지는 않음. [Linux Device Driver] Device Driver와 application으로 led, 버튼 제어 폴더 새로 만들고 그 안에 c코드 추가 ubuntu@ubuntu8:~/pi_bsp/drivers/p238_ledkey$ vi ledkey_app.c 일단 application부터 만들어봅시다. system call 함수 만들 때 썼던 코드 재활용합시다. #include #include #include #include program-developers-story.tistory.com sudo mknod ledkey_array 기존 .. 2024. 2. 26.
[Linux Device Driver] Device Driver와 application으로 led, 버튼 제어 폴더 새로 만들고 그 안에 c코드 추가 ubuntu@ubuntu8:~/pi_bsp/drivers/p238_ledkey$ vi ledkey_app.c 일단 application부터 만들어봅시다. system call 함수 만들 때 썼던 코드 재활용합시다. #include #include #include #include #pragma GCC diagnostic ignored "-Wunused-result" int main(int argc, char *argv[]) { unsigned int val=0, key_data,key_data_old=0; int i; if(argc < 2) { printf("USAGE : %s ledVal[0x00~0xff]\n",argv[0]); return 1; } val = s.. 2024. 2. 23.
반응형