我想实现的是,读取光电传感器输入到MINI2440的GPIO口的电平,定义了一个GPIO口:GPF1。写了以下一个驱动以及测试程序,不知道为什么读不进任何数据。请教大牛啊!
驱动程序:
#define DEVICE_NAME "sensor"
static int sensor_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)
{
unsigned long p = *ppos;
unsigned int count = size;
int ret = 0;
unsigned int tmp = 0;
s3c2410_gpio_cfgpin(S3C2410_GPF1, S3C2410_GPF1_INP);
tmp = s3c2410_gpio_getpin(S3C2410_GPF1);
if (copy_to_user(buf, (void*)(tmp), count)) /*读数据到用户空间*/
{
ret = - EFAULT;
}
else
{
*ppos += count;
ret = count;
printk(KERN_INFO "read %d bytes(s) from %d\n", count, p);
}
return ret;
}
static struct file_operations sensor_fops = {
.owner = THIS_MODULE,
.read = sensor_read,
};
static int __init sensor_init(void)
{
int ret;
ret = register_chrdev(SENSOR_MAJOR, DEVICE_NAME, &sensor_fops);
if (ret < 0) {
printk(DEVICE_NAME " can't register major number\n");
return ret;
}
devfs_mk_cdev(MKDEV(SENSOR_MAJOR, 0), S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, DEVICE_NAME);
printk(DEVICE_NAME " initialized\n");
return 0;
}
static void __exit sensor_exit(void)
{
devfs_remove(DEVICE_NAME);
unregister_chrdev(SENSOR_MAJOR, DEVICE_NAME);
}
module_init(sensor_init);
module_exit(sensor_exit);
以下是测试程序:
int main(void)
{
int fd = open("/dev/sensor", 2);
if (fd < 0)
{
perror("open sensor device:");
return 1;
}
char buffer[30];
int len = read(fd, buffer, 1);
if (len > 0)
{
buffer[1] = '\0';
printf("sensor value: %s\n", buffer);
}
else
{
perror("read sensor device:");
return 1;
}
close(fd);
}