- 论坛徽章:
- 0
|
2.4中的gpio要把内核数据放在proc下面,方法比较麻烦。看2.6的驱动,里面采用ctl_table结构来做,
而且是可读写的,使用和实现起来非常方便,统一放在proc/sys下面。
static ctl_table gpio_table[] = {
{
.ctl_name = 3,
.procname = "gpio2",
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = &gpio_sysctl_op,
},
{
.ctl_name = 2,
.procname = "gpio1",
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = &gpio_sysctl_op,
},
{
.ctl_name = 1,
.procname = "gpio0",
.maxlen = sizeof(int),
.mode = 0644,
.proc_handler = &gpio_sysctl_op,
},
{ .ctl_name = 0 }
};
在写gpio_sysctl_op实现时遇到一些麻烦,比如说cat /proc/sys/gpio/gpio0 会不停的输出,后来看了
下别人的代码,加了一段程序就可以了
static int gpio_sysctl_op(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
if (*ppos > 0) {
*lenp = 0;
return 0;
}
在driver/cdrom/cdrom.c里面它是这样加的
if (!*lenp || (*ppos && !write)) {
*lenp = 0;
return 0;
}
此外你要使cat /proc/sys/gpio0 能正确显示,送到用户空间的必须是字符串,所以读出来的十六进制数要转换一下的。
整个函数如下,对其中的lenp和ppos还是搞得不是很清楚。
static int gpio_sysctl_op(ctl_table *table, int write, struct file *filp,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
int i;
unsigned int port_data = 0;
unsigned char str_data[24] = {0};
if (!*lenp || (*ppos && !write)) {
*lenp = 0;
return 0;
}
if (!write){
/*read*/
/*
if (*ppos > 0) {
*lenp = 0;
return 0;
}*/
port_data = ar7100_reg_rd(AR7100_GPIO_IN);
for ( i = 0 ; i
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/83623/showart_1353785.html |
|