2013-09-23 4 views
1

요약 : 필드는 struct device이며 디바이스 드라이버 모듈에서 자유롭게 사용할 수 있습니까? 나는 나 내부 변수를 제어 할 수 있도록 내 문자 장치 드라이버 모듈에 대한 매우 간단한 sysfs를 입력 만드는 오전sysfs : struct device platform_data 필드를 자유롭게 사용할 수 있습니까?

(나는 ioctl()proc 파일 시스템을 사용하여 알고 있기 때문에 더 이상 사용되지 않습니다를.) 나는 /sys/class/에서 클래스를 만들기 위해 class_create()를 호출 device_create()을 눌러 새 장치 항목을 만듭니다. 그런 다음 device_create_file()으로 전화하여 드라이버에 대한 내로드 및 저장 루틴을 설정합니다. 이 일과에서 운전 기사를 잠그고 싶습니다. 운전 기사의 주요 구조에는 뮤텍스가 있습니다. platform_data 필드를 사용하여 private_data 필드가 struct file이고 모듈의 open() 루틴에있는이 구조체에 대한 포인터를 저장할 수 있습니까? 그것은 device_create 이후에 NULL로 설정되어 있으므로 OK로 표시되지만 확실하지는 않습니다. 내가하고 싶은 무엇

은 다음과 같습니다

struct mymodule mymod; // main module structure, has a mutex called lockmx 

static ssize_t mydev_store_val(struct device *dev, 
           struct device_attribute *attr, 
           const char *buf,size_t count) 
{ 
    struct mymodule *mymodp=(struct mymodule*)dev->platform_data; 

    if(mutex_lock_interruptible(&mymodp->lockmx)) 
     return 0; 

    // get data from buf 

    mutex_unlock(&mymodp->lockmx); 

    return count; 
} 

DEVICE_ATTR(mydeva,S_IWUSR|S_IRUGO,NULL,mydev_store_val); 

static int __init modinit(void) 
{ 
    ... 

    dev_t dev; // alloc'ed already 

    myclass=class_create(THIS_MODULE,"myclass"); 
    mydev=device_create(myclass,NULL,dev,NULL,"mydev"); 
    mydev->platform_data=&mymod; 
    device_create_file(mydev,&dev_attr_mydeva); 

    ... 
} 

그래서이 기록 할 수있는 항목 /sys/class/myclass/mydev/mydeva을 만듭니다. platform_data 필드를 사용할 수있는 경우 전역을 사용하지 않아도됩니다. 하지만 그것이 내 밑으로 움직인다면 커널은 기껏해야 어쩌면 당황 스러울 것이다.

답변

1

이러한 포인터는 drvdata 필드에 저장 될 수 있습니다.이 포인터는 사용자가 struct device의 정의를 보면 사용자가 볼 수 없도록 독창적으로 숨겨져 있습니다. 그게 내가 찾던 정확히 무엇이고,

mydev = device_create(myclass, NULL, dev, &mymod, "mydev"); 
... 
struct mymodule *mymodp = dev_get_drvdata(dev); 
+0

감사 :

device_create의 네 번째 매개 변수를 통해 초기화 및 dev_get_drvdata 그것을 읽어보십시오. 나는 LDD3에서 일하고있다. (그들은 커브가 가파르면서 4th ed를 쓰기를 바란다.) 커널 코드를 살펴보면 비슷한 dev_set_drvdata()가있다. dev_set_drvdata()는 dev-> p-> driver_data를 설정한다. 이미되었습니다. 알아두면 편리합니다. –