강좌 & 팁
안녕하세요 판다 이우영입니다.
저번 시간부터 IOCTL 공부를 시작했습니다.
오늘도 간단한 복습부터 시작하겠습니다.
1. 복습!!!
ioctl은 디바이스 드라이버가 다양하게 동작 할 수 있도록 도와준다고 했습니다.
그래서 디바이스 드라이버에 매우 의존적이라고 했었죠.
ioctl의 함수 형태 기억나시나요?
한번 더 살펴 보겠습니다.
3개의 인자를 넘겨 준다고 했었습니다.
fd(파일디스크립터번호), request(명령), argp(넘겨줄 변수의 포인터)
오늘은 이함수를 어떤식으로 사용하는지 알아 보도록 하겠습니다.
2. IOCTL 사용법
ioctl도 file_operations 구조체에 등록을 해주어야 합니다.
struct file_operations ioctl_fops = { .owner = THIS_MODULE, .read = ioctl_read, .poll = ioctl_poll, .open = ioctl_open, .ioctl = ioctl_ioctl,
.release = ioctl_release, }; |
위와 같이 .ioctl에 만든 함수 이름을 넣어주세요
ioctl은 한가지 동작이 아닌 여러가지 동작을 request( cmd ) 를 통해 결정 합니다.
말이 어려울 수 있으나 간다히 switch 문을 통해서 각각의 동작을 구현 해 주기만 하면 됩니다.
아래는 간단한 모습입니다.
int ioctl_ioctl(struct
inode *inode, struct file
*filp, unsigned int cmd, unsigned
long arg) {
ioctl_info ctrl_info; int size;
if(_IOC_TYPE(cmd)
!= IOCTL_MAGIC) { printk("magic
err\n"); return
-EINVAL; } if(_IOC_NR(cmd)
>= IOCTL_MAXNR) { printk("NR
err\n"); return
-EINVAL; } size = _IOC_SIZE(cmd);
// printk("ioctl number =
%d\n",cmd); switch(cmd) { case LED_ON
: *led_data = 0; break; case
LED_OFF: if(ptrmng
!= NULL) { del_timer(&(ptrmng->timer)); } *led_data = LED; break; } } |
소스를 보시면 LED_ON, LED_OFF 명령을 지원하는 ioctl 함수 입니다.
그저 cmd에 온 명령을 보고 동작만 하도록 해주면 됩니다.
(cmd에 오는 명령은 응용프로그램에서 날려줍니다.)
한가지 조심할것은 cmd가 단순한 변수 형태가 아니라는 점 입니다.
그렇기 때문에 소스에서 못보시던 메크로를 사용하고 그것을 통해 예외처리를 하는 모습도 보입니다.
여기에 대해서는 다음시간에 알아 보도록 하겠습니다.
오늘은 아주 간단하게 마무리 하겠습니다.
그럼 다음 시간에 만나요~~~