2016-10-13 2 views
1

문자 장치 드라이버 (커널 모듈)를 만들려고합니다. 가져가로드 된 modue은 아래에 볼 수있는 것처럼 문자 장치를 만듭니다해당 장치 또는 주소가 없기 때문에 장치 파일을 열지 못합니다.

[email protected]:~# ls -l /dev/socledchrdevregion 
crw-rw-rw- 1 root  root  246, 0 Jan 1 08:56 /dev/socledchrdevregion 

을하지만 난 테스트 응용 프로그램 (따로 특별한 일을하지 않는 드라이버 내부의 open 함수를 사용하여 장치를 열 때

[email protected]:~# ./led_ioctltest 
led_ioctltest: open /dev/socledchrdevregion failed due to No such device or addres 

다음/프록/장치의 함량이다 : 디버그 메시지) 인쇄, 내가 오류

[email protected]:~# cat /proc/devices 
Character devices: 
    1 mem 
    5 /dev/tty 
    5 /dev/console 
    5 /dev/ptmx 
10 misc 
13 input 
29 fb 
81 video4linux 
89 i2c 
90 mtd 
116 alsa 
128 ptm 
136 pts 
153 spi 
180 usb 
189 usb_device 
199 galcore 
207 ttymxc 
244 vuc_sim 
245 vuc 
246 socledchrdevregion 
247 ubi0 
248 mxc_src 
249 mxc_vpu 
250 conti_kmod_tracing 
251 mxc_ipu 
252 ptp 
253 pps 
254 rtc 

Block devices: 
259 blkext 
31 mtdblock 
179 mmc 

장치는 m으로 존재

if ((ret = alloc_chrdev_region(&first, 0, 1, DEVICE_NAME)) < 0) 
{ 
     printk(KERN_ERR PRINTK_CONTEXT": FAILED TO ALLOCATE CHRDEVREGION \n"); 
     return -1; 
} 

printk(KERN_INFO PRINTK_CONTEXT": ALLOCATE CHRDEVREGION SUCCESS \n"); 

classptr = class_create(THIS_MODULE, "socledclass"); 
device_create(classptr, NULL, first, NULL, DEVICE_NAME); 
printk(KERN_INFO "PRINTK_CONTEXT: DEVICE CREATED \n"); 
led_cdevptr = cdev_alloc(); 
led_cdevptr->ops = &led_fops; 

사람이를 찾는 데 좀 도와 주 시겠어요 : 이것은 LKM의 조각입니다

#define DEVICE "/dev/socledchrdevregion" 
fd = open(DEVICE, O_RDONLY); 

: ajor 번호는이 내가 장치를 열려고 시도하는 방법은 246

입니다 오류? 필요한 경우 전체 코드를 게시합니다.

+1

잘 모르겠지만 장치 파일 (문자 특수 장치)이 있지만 컴퓨터에서 사용할 수없는 하드웨어가 필요합니다. 따라서 장치 파일 이름이 있지만 해당 장치 파일 이름과 연결할 장치를 사용할 수 없으므로 오류가 발생합니다. 의견을 주셔서 감사합니다 –

+0

, 당신은 드라이버 모듈이 오류를 던지고 있다는 것을 의미합니까 아니면 리눅스 드라이버 프레임 워크가 그 오류를 던지고 있습니까? 드라이버 모듈을 구현했습니다. 그래서 일부 디버그 메시지를 드라이버 모듈에 넣고 볼 수 있습니다. 또한 도움이된다면 여기에 드라이버 모듈의 전체 코드를 표시 할 수 있습니다. 장치 파일 뒤에 실제 하드웨어가없는 더미 문자 장치 드라이버를 개발 한 사람이 있습니까? – srik

+0

나는 운전 기사를 썼다는 것에 감사하지 않았습니다. 오류를 던지는 프레임 워크 일 수 있습니다. 나는 확실하지 않다. 나는 많은 도움을 줄 관련 경험이 없습니다. 예, 하드웨어가 없어도 작동하는 드라이버를 작성할 수 있습니다. 하나의 예제는'/ dev/null'입니다. –

답변

3

장치를 sysfs에 등록 했으므로 장치가 표시되고 udev가 장치 파일을 만듭니다. 그러나 실제 장치를 등록하지 않았습니다. 메이저 미성년자가 배정되었지만 운전사와 연결되어 있지 않습니다.

아마도 cdev_add을 건너 뛰었습니다.

간단히 말해서, 순서는 다음과 같습니다. alloc_chrdev_region은 사용할 수있는 주요/부수 장치 ID 범위를 제공하며 장치에만 사용됩니다.

cdev_add 해당 ID의 실제 처리기를 등록하십시오 (장치에/dev/null 또는/dev/random과 같이 사전 할당 된 영역이 설정된 경우 alloc_chrdev_region을 호출하지 않고 호출 할 수 있습니다).

+0

Shemesh, 답장을 보내 주셔서 감사합니다, 사실 나는 cdev_add()를 잊어 버렸습니다. 나는 기본적인 이해가 부족한 것 같다. 나는 alloc_chrdev_region()이 문자 디바이스 영역을 할당하고 이것을 커널 드라이버 프레임 워크에 추가하는 책임이 있다고 생각했습니다.하지만 지금은 cdev_add 함수를 보면 cdev_add가 그 일을 담당하는 것 같습니다. – srik

+0

@Shemesh, 위의 코멘트를 편집 할 수 없어서 새 코멘트를 추가하려고합니다. 당신이나 다른 사람이 곧 "alloc_chrdev_region"과 "cdev_add"의 차이점을 알려주십시오. – srik

+0

Shemesh, 업데이트 주셔서 감사합니다. – srik

관련 문제