요약 : 필드는 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
필드를 사용할 수있는 경우 전역을 사용하지 않아도됩니다. 하지만 그것이 내 밑으로 움직인다면 커널은 기껏해야 어쩌면 당황 스러울 것이다.
감사 :
는device_create
의 네 번째 매개 변수를 통해 초기화 및dev_get_drvdata
그것을 읽어보십시오. 나는 LDD3에서 일하고있다. (그들은 커브가 가파르면서 4th ed를 쓰기를 바란다.) 커널 코드를 살펴보면 비슷한 dev_set_drvdata()가있다. dev_set_drvdata()는 dev-> p-> driver_data를 설정한다. 이미되었습니다. 알아두면 편리합니다. –