tiny4412 驱动 (8)leds

博客提到同时支持4个LED,与前面不同的是在open/write函数稍作修改。write函数中usrbuf为char型,使用copy_from_user拷贝后的rev_buf为int型。开始rev_buf用char型时收不到测试工具参数,改为int型后可正常控制,作者对此表示费解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里同时支持4个LED

和前面不同之处只是在open/write函数稍作修改即可

static int led_open (struct inode *inode, struct file *file)
{
	printk(KERN_INFO "drv open \n");	

	/* set GPM4_0 , GPM4_1, GPM4_2, GPM4_3  as output */
	led_gpio->con |= (1 << 0*4) + (1<<1*4) + (1<<2*4) + (1<<3*4);
	
	return 0;
}

static ssize_t led_write (struct file *file, const char __user *usrbuf, size_t len, loff_t *off)
{
	int i = 0;
	int cmd,opt;
	int rev_buf[8] = {0};
	
	printk(KERN_INFO "drv write \n");		

	if(copy_from_user(rev_buf,usrbuf,8))
		return -EFAULT;

	printk(KERN_INFO "data ");		
	for(i = 0; i < 8;i++)
	{
		printk(KERN_INFO "%d ", rev_buf[i]);		
	}
	printk(KERN_INFO "\n");		

	cmd = rev_buf[0];
	opt = rev_buf[1];

	printk(KERN_NOTICE "cmd : %d opt : %d \n", cmd, opt);

	if(cmd == 0)
	{
		
		// off
		led_gpio->data |= (1<<opt);
	}
	else if(cmd == 1)
	{
		// on
		led_gpio->data &= ~(1<<opt);
	}
	else
	{
		// do nothing.
	}
	
	return 0;
}

为什么因此要分开写呢,主要是这里有个比较奇怪的问题,仔细看write函数usrbuf是char, 而使用copy_from_user拷贝后的rev_buf是int型。

开始rev_buf我使用的char型,发现测试工具发下来的参数都收不到, 导致rev_buf一直为0.改成int后可以正常控制。

表示费解???

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值