캐릭터 디바이스 드라이버



1. 디바이스 타입



  • dev_t
major/minor 번호가 조합된 수형
major 번호와 쌍을 이뤄 하나의 장치 번호를 구성


- 매크로 (include/linux/kdev_t.h)

MAJOR(dev_t dev);         주번호 추출

MINOR(dev_t dev);         부번호 추출

MKDEV(int ma, int mi);    번호 설정



  • major 번호의 결정

- Manual Allocation

현재 사용 중이지 않은 major 번호를 알아낸 후 직접 하드 코딩함.

- Dynamic Allocation

alloc_chrdev_region() 함수를 이용하여 동적으로 할당

단점: 미리 디바이스 파일을 만들어 둘 수 없음
해결책: 장치 번호 등록 후 /proc/devices를 읽어 major 번호를 얻고, 장치 파일을 만드는 스크립트를 활용한다.




  • cdev 구조체

커널은 내부적으로 캐릭터 디바이스를 표현하기 위해 cdev 구조체를 사용
커널이 file operation에 등록된 디바이스 등록 함수 (open, read..)를 호출하기 전에 할당 및 등록하여야 한다.

<linux/cdev.h> 

 struct cdev{

      struct kobject kobj;

      struct module *owner;

      const struct file_operations *ops;

      struct list_head list; dev_t dev;

      unsigned int count;

}






2. 캐릭터 디바이스 드라이버 API



  • register_chrdev_region()

디바이스 개수를 포함한 디바이스 드라이버 등록 함수



- 함수


int register_chrdev_region (dev_t first, unsigned int count, char* name)



- 매개 변수


 first 

 할당 받으려는 디바이스 번호 범위 중 시작 번호.

 major/minor 번호를 모두 포함

 count

 minor 번호로 디바이스 개수

 *name

 디바이스 이름 (/proc/devices 에 나타난다)





  • alloc_chrdev_region()
디바이스 번호를 동적으로 할당하기 위한 함수

- 함수

int alloc_chrdev_region(dev_t *dev, unsigned int firstminor, unsigned int count, char *name)

- 매개 변수

*dev

 성공적인 경우 디바이스 번호가 할당

 firstminor

 디바이스에 할당될 첫번째 minor number, 일반적으로 0

 count

 minor number로 디바이스 개수

 *name

 디바이스 이름(/proc/devices와 sysfs에 나타난다)





  • unregister_chrdev_region()
사용중인 디바이스 번호 해제

- 함수

void unregister_chrdev_region (dev_t first, unsigned int count)




  • cdev_init()
cdev 구조체 초기화

- 함수

void cdev_init (struct *cdev, struct file_operations *fops)

- 매개 변수

 *cdev 

 초기화할 cdev 구조체 

 *fops

 등록할 fop 구조체 포인터 





  • cdev_add()
준비된 cdev 구조체를 커널에 등록, 캐릭터 디바이스 등록

- 함수

void cdev_add (struct cdev *cdev, dev_t num, unsigned int count)

- 매개변수

 *cdev

 등록한 cdev 구조체

 num

 등록할 디바이스 번호 (major/minor 포함) 

 count

 등록할 디바이스 개수, 주로 1 






  • cdev_del()
등록된 캐릭터 디바이스를 제거.
디바이스 파일도 삭제해야 한다.
디바이스 번호도 삭제, unregister_chrdev_region() 이용

- 함수

int cdev_del (struct cdev *cdev)








+ Recent posts