主题 : 怎样读取GPIO端口输入的高低电平? 复制链接 | 浏览器收藏 | 打印
000
级别: 新手上路
UID: 33880
精华: 0
发帖: 1
金钱: 5 两
威望: 1 点
综合积分: 2 分
注册时间: 2010-12-07
最后登录: 2010-12-07
楼主  发表于: 2010-12-07 19:55

 怎样读取GPIO端口输入的高低电平?

我想实现的是,读取光电传感器输入到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);
}
自由,自强,共享,共创。
级别: 论坛版主
UID: 12573
精华: 27
发帖: 8838
金钱: 46490 两
威望: 9298 点
综合积分: 18216 分
注册时间: 2010-01-09
最后登录: 2019-07-16
1楼  发表于: 2010-12-08 11:59
初始化最好不要放在read
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.arm9home.net/read.php?tid-14431.html

[注]: 此处签名链接仅为指引方向,而非解答问题本身.