天嵌 ARM开发社区

 找回密码
 注册
查看: 2558|回复: 12

修改了gpio驱动读端口状态,运行不正常?

[复制链接]
mysde 发表于 2010-8-31 16:15:06 | 显示全部楼层 |阅读模式
本帖最后由 mysde 于 2010-8-31 16:17 编辑

//修改了gpio驱动,为读取端口GPB9位状态,编译通过,运行读出的值是87604而不是0或1,
写错了还是思路不对,请各位指正。
static unsigned long gpio_table[]={
S3C2410_GPB5,
S3C2410_GPB6,
S3C2410_GPB7,
S3C2410_GPB8,
S3C2410_GPB9,//增加部分}

static unsigned int gpio_cfg_tagble[]={
S3C2410_GPB5_OUTP,
S3C2410_GPB6_OUTP,
S3C2410_GPB7_OUTP,
S3C2410_GPB8_OUTP,
S3C2410_GPB9_INP,}//增加部分

static ssize_t tq2440_gpio_read(struct file *file,char *buffer,size_t count,loff_t *ppos)
{
int dat;
dat=s3c2410_gpio_getpin(gpio_table[4]);
copy_to_user(buffer,(int *)&dat,sizeof(dat));
return 0;
}
static struct file_operations dev_fops=}
.owner=THIS_MODULE,
.read=tq2440_gpio_read,//增加部分
.ioctl=tq2440_gpio_ioctl,
};
还有两句改成if(arg>5)和for(i=0;i<5;i++)  原来都是4
天嵌_support1 发表于 2010-8-31 17:25:03 | 显示全部楼层
那个版本的内核,我在最新版本的内核怎么找不到你这个函数
tq2440_gpio_read(struct file *file,char *buffer,size_t count,loff_t *ppos)
 楼主| mysde 发表于 2010-9-1 06:51:43 | 显示全部楼层
tq2440_gpio_read(struct file *file,char *buffer,size_t count,loff_t *ppos)
是我加的。
2.6.30.4内核
 楼主| mysde 发表于 2010-9-1 07:05:37 | 显示全部楼层
本帖最后由 mysde 于 2010-9-1 07:07 编辑

下面这段是其他论坛的帖子:
"
请教下关于Linux GPIO驱动:
key_values[0] = 0x30+s3c2410_gpio_getpin(S3C2410_GPG0)。我这样读GPG0的状态能成功,但要是读GPG10就出不出来,请问是怎么回事呢?核是s3c2440,操作系统是Linux-2.6.29哈~帮帮小弟,不胜感激!
"

加上0x30,想变成字符0和1???
 楼主| mysde 发表于 2010-9-1 19:22:29 | 显示全部楼层
网上找的io驱动,读端口,各位帮看看能用不?

static ssize_t myGPIO_read(struct file *filp, char *buf, size_t count, loff_t *f_pos)

{

char dat;

size_t read_size = count;

PRINTK("GPIO read called!\n");

PRINTK("\tcount=%d, pos=%d\n", count, (int)*f_pos);

/* if(*f_pos >= sizeof(myGPIO_Buffer))

{

PRINTK("[GPIO read]Buffer Overlap\n");

*f_pos = sizeof(myGPIO_Buffer);

return 0;

}

if((count + *f_pos) > sizeof(myGPIO_Buffer))

{

PRINTK("count + f_pos > sizeof buffer\n");

read_size = sizeof(myGPIO_Buffer) - *f_pos;

}*/

dat= GPFDAT;

copy_to_user(buf,&dat,1);

// *f_pos += read_size;

return read_size;

}
 楼主| mysde 发表于 2010-9-2 10:57:28 | 显示全部楼层
本帖最后由 mysde 于 2010-9-2 11:09 编辑

终于读出端口位状态。
static ssize_t tq2440_gpio_read(struct file *filp,char *buffer,size_t count,loff_t *ppos)
{
   if(s3c2410_gpio_getpin(gpio_table[3]))
     return 1;
  else
    return0;

}
为实验代码没有规范写。

--------------------------------------------------------
 楼主| mysde 发表于 2010-9-2 11:12:05 | 显示全部楼层
看GPIO驱动,读写函数里都有copy_to_user(),没用这个函数为什么也能正确执行?
天嵌_support1 发表于 2010-9-2 11:31:53 | 显示全部楼层
6# mysde


恭喜你哈....读写引脚内核有函数的,不用自己写.....
 楼主| mysde 发表于 2010-9-2 12:27:38 | 显示全部楼层
晕,在哪啊?
 楼主| mysde 发表于 2010-9-2 13:23:53 | 显示全部楼层
试验IO读写
一:inl(),outl()函数.
二:/dev/port.

谢版主!
 楼主| mysde 发表于 2010-9-3 10:31:06 | 显示全部楼层
应用程序不能调用ioremap() inw() outw(),得在驱动里写。

dev/port可以在应用层使用,但我们的dev下没有port驱动,怎么加???
天嵌_support1 发表于 2010-9-3 14:43:34 | 显示全部楼层
11# mysde


你去看看linux移植手册的
Step 12、完善串口驱动
         12、完善串口驱动
 楼主| mysde 发表于 2010-9-3 22:41:51 | 显示全部楼层
没看明白啊
请版主明示
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号-2 )

GMT+8, 2024-9-18 04:34 , Processed in 1.030208 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表