linux字符設備驅動 自動創建設備節點的的方法


 

 

下面這個注冊方法是自動創建設備節點的字符設備驅動的方法

#define DEVICE_NAME  "fpga_dma"
static int dev_major = 0;
static struct class *fpga_class;
static struct cdev fpgaDevice;

static int  dev_init(void)
{
    int result;
    int err;
    dev_t dev = MKDEV(dev_major, 0);

    if (dev_major)
        result = register_chrdev_region(dev, 1, DEVICE_NAME);
    else {
        result = alloc_chrdev_region(&dev, 0, 1, DEVICE_NAME);
        dev_major = MAJOR(dev);
    }
    if (result < 0)
    {
        printk("unable to get major %d\n", dev_major);
        return result;
    }
    printk("get major is %d\n", dev_major);
    if (dev_major == 0)
        dev_major = result;

    cdev_init(&fpgaDevice, &fpga_dma_fops); 
    fpgaDevice.owner = THIS_MODULE;
    fpgaDevice.ops = &fpga_dma_fops;
    err = cdev_add(&fpgaDevice, dev, 1);
    if (err)
        printk("error %d add fpga ", err);

    fpga_class = class_create(THIS_MODULE, DEVICE_NAME);
    if (IS_ERR(fpga_class))
    {
        printk("Err:failed in creating class.\n");
        return -1;
    }
    class_device_create(fpga_class, NULL, MKDEV(dev_major, 0), NULL, "%s", DEVICE_NAME);
    
    printk("MPC8377core FPGA_GPIO_driver installed OK\n");

    return 0;
}
//這里面又兩個函數
fpga_class = class_create(THIS_MODULE, DEVICE_NAME);
和class_device_create(fpga_class, NULL, MKDEV(dev_major, 0), NULL, "%s", DEVICE_NAME);
是注冊時自動創建節點的關鍵函數,具體函數意義,可以網上搜索


/**********************************************************/
static struct file_operations fpga_dma_fops = {
    owner:        THIS_MODULE,
    //ioctl:    fpga_dma_ioctl,
    //open:        fpga_dma_open,
    //release:    fpga_dma_close,
};


static void dev_clean(void)
{
    cdev_del(&fpgaDevice);
    class_device_destroy(fpga_class, MKDEV(dev_major, 0));
    class_destroy(fpga_class);
    unregister_chrdev_region(MKDEV(dev_major, 0), 2);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM