글
■ Introduction
데이터를 전송하기 위해 write()함수를 사용하고, 반대로 데이터를 읽기 위해 read()함수를 이용한다.
상호간에 통신을 위해서는 제어기능과 디바이스상태를 확인할 수 있는 방법이 필요하다.
제어 데이터와 전송될 데이터, 상태 데이터와 수신 데이터간의 구별을 할 수 있는 방법이 필요하다.
■ 매개변수 전달
ret = ioctl(int fd, int request, char* argp)
int xxx_ioctl(struct inode, struct firle *filp, unsigned int cmd, unsigned long arg)
{
return ret;
}
- fd : 입출력 지정자로써 일반 파일, 소켓, 장치 등을 말한다.
- request : ioctl()로 요청할 정보를 지정하기 위해 사용된다.
- argp : request를 통해 얻은 정보를 저장하기 위한 버퍼이다.
■ 특징
- read(), write()함수와 같이 쓰기와 읽기 처리가 가능하다.
- 하드웨어의 제어나 상태를 얻기 위해 사용된다.
- 응용 프로그램의 명령에 따라 디바이스 드라이버의 매개변수 해석이 달라진다.
- ioctl은 cmd인자에 따라 올바른 동작을 선택하기 때문에 switch문으로 구성된다.
■ 단점
추가되는 인자에 대해서 타입 체크를 하지 않기 때문에, ioctl에 잘못된 인자를 넘겨주더라도 컴파일러가 그것에 대해
경고할 수 없으며, 프로그래머는 실행 전까지 에러를 발견하지 못한다.
■ cmd 구성
- Direction : 읽기를 위한 요구 명령인지 쓰기를 위한 요구 명령인지 구분하는 속성
- Size : 매개변수 arg를 통해 전달되는 메모리의 크기
- Type(Magic Number) : 다른 디바이스 드라이버의 ioctl명령과 구분하기 위한 값
- Number : 명령을 구분하는 명령어의 순차 번호
■ Macro
○ cmd 명령을 만드는 macro 함수
_IO(type, number) : 부가적인 데이터가 없는 명령을 만드는 macro
_IOR(type, number) : 디바이스 드라이버에서 데이터를 읽어오기 위한 명령을 만드는 macro
_IOW(type, number, size) : 디바이스 드라이버에 데이터를 쓰기를 수행하기 위한 명령을 만드는 macro
_IOWR(type, number, size) : 디바이스 드라이버에 읽고 쓰기를 수행하기 위한 명령을 만드는 macro
○ cmd 명령을 해석하는 macro 함수
_IOC_DIR(cmd) : Direction 필드 값을 읽는 macro
_IOC_NONE : 속성이 없다
_IOC_READ : 읽기 속성
_IOC_WRITE : 쓰기 속성
_IOC_READ|_IOC_WRITE : 읽기 쓰기 속성
_IOC_SIZE(cmd) : Size 필드 값을 읽는 macro
_IOC_TYPE(cmd) : Magic number 필드 값을 읽는 macro
_IOC_NR(cmd) : Number 필드 값을 읽는 macro
○ Return Value
-EINVAL : 잘못된 명령 번호(POSIX에서는 -ENOTTY)
'L inux > Device Driver' 카테고리의 다른 글
문자 디바이스 (0) | 2011.09.28 |
---|---|
디바이스 드라이버의 이해 (2) | 2011.09.28 |
인터페이스 정보 얻기 (0) | 2011.04.14 |
ioperm() - 포트의 입출력 허가권 설정 / inb, outb (0) | 2011.04.12 |
mknod() - 디바이스 파일 생성 (0) | 2011.04.04 |
RECENT COMMENT