创建字符设备并创建文件系统接口

定义全局变量:
static int tftloadopen;
struct cdev * tftloaddev;
struct class * tftload_class;
static dev_t tftload_dev;
struct device *ub948_dev;
#define TFTLOAD_MAJOR MAJOR(tftload_dev)
#define TFTLOAD_MINOR MINOR(tftload_dev)

文件系统接口:
static char semiskybuf[100] = “Semsiky Attribute Example”;
void disp948_enable_backlight(unsigned int en)
{
int ret;
if(en==1)
ret=disp948_reg_write(g_client,0x1F,0x09);//enable gpio5 output 1
else
ret=disp948_reg_write(g_client,0x1F,0x01); //enable gpio5 output 0
}
2、文件系统属性接口定义

/*************************************************************/
//inputing cat command will call this function
static ssize_t ub948_enbacklight_show(struct device *dev, struct device_attribute *attr, char *buf)
{
	return sprintf(buf, "%s\n", semiskybuf);
	//return sprintf(buf, "%s\n", enbacklight_status);
	
}
//inputing echo command will call this function
static ssize_t ub948_enbacklight_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t len)
{
	sprintf(semiskybuf, "%s", buf);
	if (!strncmp(buf, "enblk:0", 7)) {
		printk("disable backlight\n");
		disp948_enable_backlight(0);
		msleep(20);
	}else if(!strncmp(buf, "enblk:1", 7)){
		printk("enable backlight\n");
		disp948_enable_backlight(1);
		msleep(20);
	}
	return len;
}
static DEVICE_ATTR(enbacklight, S_IWUSR | S_IRUSR, ub948_enbacklight_show, ub948_enbacklight_store);
/*********************************************************************/

注册文件系统接口:

static const struct file_operations tftload_fops = {
	.owner		 = THIS_MODULE,		/* owner */	
	.open		 = 	tftload_open,	/* open */
	.release	 = 	tftload_close,	/* release */
	.poll 		 = 	tftload_poll,
	.read      = 	tftload_read,  
	.write     =    tftload_write,
	.unlocked_ioctl	 = tftload_ioctl,
};

init初始化函数:

static int __init disp948_init(void)
{
    printk("[disp948]:%s\n",__FUNCTION__);
    //分配一个字符设备
     tftloaddev = cdev_alloc();
    if(tftloaddev == NULL)
    {
       	return -1;
    }
	if(alloc_chrdev_region(&tftload_dev, 0, 1, TFTLOAD_DEVICE_NAME))
    {
    		printk("Register tftload char dev error\n");
    		return -1;
    }
	tftloadopen = 0;
	//初始化
	cdev_init(tftloaddev, &tftload_fops);
	if(cdev_add(tftloaddev, tftload_dev, 1))
   	{
        printk("Add tftload char dev error!\n");
    }
    //创建一个字符设备
    tftload_class = class_create(THIS_MODULE, "tftload_class");
    if(IS_ERR(tftload_class)) 
    {
    	printk("Err: failed in creating tftload_class.\n");
        return -1;
    }
    /* register your own device in sysfs, and this will cause udevd to create corresponding device node */
    ub948_dev=device_create(tftload_class, NULL, tftload_dev, NULL, TFTLOAD_DEVICE_NAME);
//创建字符属性接口
//ctreat attr
    if(device_create_file(ub948_dev, &dev_attr_enbacklight))
	{
		return -1;
	}
    //end creat attr 
    return  i2c_add_driver(&disp948_driver);
}

退出函数:

static void __exit disp948_exit(void)
{
    printk("[disp928]:%s",__FUNCTION__);
    i2c_del_driver(&disp948_driver);
    unregister_chrdev_region(MKDEV(TFTLOAD_MAJOR,TFTLOAD_MINOR),10);
        
    cdev_del(tftloaddev);
    device_destroy(tftload_class, tftload_dev);
    class_destroy(tftload_class);
}
MODULE_AUTHOR("czwyle");
MODULE_DESCRIPTION("disp948 chip driver");
MODULE_LICENSE("GPL");

module_init(disp948_init);
module_exit(disp948_exit);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值