第一步:
typedef struct {
struct cdev cdev;
dev_t devid;
struct class *cls;
}mypdata;
ssize_t myread(struct file *fl, char *__user buf, size_t len, loff_t *off)
{
//...
return 0;
}
struct file_operations fops = {
.owner = THIS_MODULE,
.read = myread,//这里举例,详细的参数查看file_operations结构体
};
第二步:
int myprobe(struct platform_device *pdev)
{
static int mi = 0;//用于记录次设备号
/// cdev 部分/
pdata->devid = MKDEV(MYMA, mi);//MYMA:主设备号
ret = register_chrdev_region(pdata->devid, COUNT, pdev->name);
if (ret < 0)
goto err2;//根据需要,回收资源
cdev_init(&pdata->cdev, &fops);
pdata->cdev.owner = THIS_MODULE;
ret = cdev_add(&pdata->cdev, pdata->devid, COUNT);
if (ret < 0)
goto err3;//根据需要,回收资源
pdata->cls = class_create(THIS_MODULE, pdev->name);
device_create(pdata->cls, NULL, pdata->devid, NULL, pdev->name);
//...
platform_set_drvdata(pdev, pdata);//保存数据
mi++;//依次分配次设备号
return 0;
}
第三步:
int myremove(struct platform_device *pdev)
{
mypdata *pdata = platform_get_drvdata(pdev);
//提取数据
unregister_chrdev_region(pdata->devid, COUNT);
cdev_del(&pdata->cdev);
device_destroy(pdata->cls, pdata->devid);
class_destroy(pdata->cls);
//..
//..
return 0;
}