动态注册字符GPIO驱动框架

模块加载和模块卸载函数

module_init(init);
module_exit(exit);

初始化函数和卸载函数

static int init(void)
{
	int ret = 0,i;
	dev_t num_dev;
	alloc_chrdev_region(&num_dev,minor,num,name);
	major = MAJOR(num_dev);
	myclass = class_create(THIS_MODULE,name);
	my_devices = kmalloc(sizeof(struct reg_dev),GFP_KERNEL);
	memset(my_devices,0,sizeof(struct reg_dev));
	my_devices.data = kmalloc(REGDEV_SIZE,GFP_KERNEL);
	memset(my_devices.data,0,REGDEV_SIZE);
	reg_init_cdev(&my_devices);
	device_create(myclass,NULL,MKDEV(major,minor),NULL,name);
	}
	gpio_init();
	return 0;
}

static void exit(void)
{
	cdev_del(&(my_devices.cdev));
	device_destroy(myclass,MKDEV(major,minor));
	class_destroy(myclass);
	kfree(my_devices);
	gpio_free(gpios);	
	unregister_chrdev_region(MKDEV(major,minor),num);
}

GPIO初始化函数

static int gpio_init(void){
	ret = gpio_request(gpios, "LED");
	s3c_gpio_cfgpin(gpios, S3C_GPIO_OUTPUT);
	gpio_set_value(gpios, 1);			
	return 0;
}

驱动注册函数

static void reg_init_cdev(struct reg_dev *dev){
	int dev;
	dev = MKDEV(numdev_major,numdev_minor);
	cdev_init(&dev->cdev,&fops);
	dev->cdev.owner = THIS_MODULE;
	dev->cdev.ops = &fops;
	cdev_add(&dev->cdev,dev,1);
}

file_operations结构体

struct file_operations fops = {
	.owner = THIS_MODULE,
	.unlocked_ioctl = io,
};

IO控制函数

static long io(struct file *file){
	gpio_set_value(gpios, 1);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值