본문 바로가기
한국으로/임베디드 리눅스

7.3 문자 드라이버

by 영킴. 2018. 7. 1.

7.3 문자 드라이버

7.3.1 디바이스 번호

디바이스 번호는 dev_t 타입으로 표현한다.

예시)
typedef __kernel__dev_t dev_t;
typedef __u32 __kernel_dev_t;
typedef unsigned int __u32;

Major 번호

디바이스의 주번호. 물리적인 디바이스를 구분하는데 사용된다.

Minor 번호

디바이스의 부번호. 부번호는 동일한 디바이스가 여러개인 경우, 이들 디바이들을 구분하는 용도로 사용한다.


즉, 같은 종류의 디바이스는 주번호가 동일하고, 부번호는 다르다.




7.3.2 디바이스 번호 할당 및 반납

int register_chrdev_region(dev_t from, unsigned count, const char* name);

디바이스 번호 고정할당
name이란 이름으로 from부터 Minor 번호를 count 개 할당, 실패 시 음수 리턴.

int alloc_chrdev_region(dev_t* dev, unsigned baseminor, unsigned count, const char* name);

디바이스 번호 자동할당
name이란 이름으로 baseminor로부터 Minor 번호를 count 개 할당하여 dev에 저장, 실패 시 음수 리턴.

void unregister_chrdev_region(dev_t from, unsigned count);

디바이스 번호 반납
from 으로부터 count 개의 Minor 번호 반납.




7.3.3 디바이스 제어 객체

inode 구조체

디바이스 번호를 표현.

i_rdev : inode 구조체가 표현하는 디바이스 파일의 디바이스 번호.
i_bdev : 블록 디바이스 표현 구조체 포인터.
i_cdev : 문자 디바이스 표현 구조체 포인터.

file 구조체

f_pos : 읽고 쓰는 위치를 나타냄.
f_flags : O_RDWR, O_RDONLY, O_NONBLCOK 같은 플래그 표현.
f_op : 해당 파일의 file_operations 객체를 가리킴.
private_data : 자유롭게 사용 가능한 변수. 주로 드라이버에서 사용하는 객체 연결.


file_operations 구조체


cdev 구조체

kobj : 디바이스 모델 표현 구조체.
owner : cdev 사용하는 모듈. 일반적으로 THIS_MODULE로 초기화.
ops : file_operations 객체 주소
dev : 디바이스 번호
count : Minor 번호 개수



<동적 할당 예시>
my_cdev = cdev_alloc();
my_cdev->ops = &my_fops;
my_cdev->owner = THIS_MODULE;
ret = cdev_add(my_cdev, devt, device_minor_count);

<정적 할당 예시>
my_cdev = cdev_init(&my_cdev, devt, device_minor_count);
my_cdev.owner = THIS_MODULE;
ret = cdev_add(my_cdev, devt, device_minor_count);




'한국으로 > 임베디드 리눅스' 카테고리의 다른 글

9.3 커널 동기화  (0) 2018.07.06
9.2 지연 작업  (0) 2018.07.06
9.1 시간처리  (0) 2018.07.06
8.1 인터럽트  (0) 2018.07.06
7.2 모듈  (0) 2018.07.01
7.1 디바이스 드라이버  (0) 2018.07.01
5.4 파일시스템  (0) 2018.07.01
5.3 메모리 관리  (0) 2018.06.29