挂载文件系统时,输出的GPIO引脚莫名的输出低电平,请大家帮忙进来看看

程序员小哈
嵌入式领域优质创作者
博客专家认证
2010-09-20 08:31:48
我使用at91rm9200,在YL9200开发板的基础上定制了自己的一个板子,系统和文件系统都是使用原开发板自带的:linux2.6.13和Cramfs,里面用QT2.3.7做了一个图形界面程序。我自己添加了一个GPIO驱动,用于控制IO的输出和输入,现在输入没有问题,输出也可以正常控制,现在的问题是:我在驱动中已经设定输出和设置高电平了(我的蜂鸣器是低电平响)。在系统启动在下面过程时,蜂鸣器响,说明与蜂鸣器相连的引脚是低电平,这点我很困惑???在挂载文件系统的时候,有什么改变GPIO的输出电平吗?此时应该bios已经过去了,我的GPIO驱动也挂载完毕了吧?请大家解惑。
Freeing init memory: 92K这句开始,蜂鸣器就响啦--!

Freeing init memory: 92K

RootDisk
mount tmpfs filesystem to /tmp
cardmgr[754]: cannot access /lib/modules/2.6.13: No such file or directory
cardmgr[754]: no sockets found!
unable to open mouse device
640x480-16bpp
fail to create MiniGUI.cfg
/etc/init.d/rcS: 113: /usr/sbin/chksd: not found
[1;34mbin[0m [1;34metc[0m [1;34mlib[0m [1;34mmnt[0m [1;34mproc[0m [1;34msbin[0m [1;34msys[0m [1;34musr[0m
[1;34mdev[0m [1;34mhome[0m [1;36mlinuxrc[0m [1;34mopt[0m [1;34mroot[0m [1;32mset_cfg[0m [1;36mtmp[0m [1;34mvar[0m
[H[JSIOCSIFADDR: No such device
SIOCSIFNETMASK: No such device
Hello, arm-linux!
/etc/init.d/rcS done.


BusyBox v1.00 (2005.05.21-05:56+0000) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

[9;0][?33l[?25l][?33l[?25lCould not read calibration: /etc/pointercal


当启动我的程序,我Open我的驱动时,蜂鸣器就不响了,因为我在Open中将引脚电平至高了
static int  gpio_open(struct inode *inode, struct file *filp) 
{
int minor;
minor = MINOR(inode->i_rdev);

at91_set_gpio_value(AT91_PIN_PA1,1);

gpio_devices[minor]++;
return 0;
}


驱动的init代码中我也强制至高了:
static int __init gpio_init(void)
{
register_chrdev(IOPORT_MAJOR, "gpiotest" ,&gpio_ctl_fops);
at91_set_gpio_output(AT91_PIN_PA1,1 ); //PA1设置成输出
at91_set_gpio_value(AT91_PINN_PA1,1);--已经强制至高了???
return 0;
}


大家帮忙看看呗,现在系统一启动就嗡嗡响,好闹心啊,莫名其妙
...全文
351 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
程序员小哈 2010-09-20
  • 打赏
  • 举报
回复
的确是其他驱动干扰,现在状态是响一声之后就被我拉高了,基本满足我的要求了,现在结贴,谢谢大家^_^
解决办法:把module_init换成late_initcall,一切搞定,结贴给分
程序员小哈 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wwwunix 的回复:]
关于驱动启动的顺序,给你一份参考文档,你可以看看:
http://hi.baidu.com/serial_story/blog/item/d40d49c6907212129c163ded.html
[/Quote]

我明白了,就是把module_init(gpio_init);换成late_initcall(gpio_init);对吧?module_exit(gpio_exit);不用变对吧?我先去试试,谢谢啦
jxj141 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wwwunix 的回复:]
建议:
1、查查datasheet,看看这个GPIO的引脚还可以用于什么?再查查相关的驱动程序。
2、在这个GPIO和蜂鸣器之间加一个锁存器。让GPIO引脚的变化不会影响到蜂鸣器。(因为这个引脚很可能是和其他设备共用的)
[/Quote]
支持!
jxj141 2010-09-20
  • 打赏
  • 举报
回复
驱动的初始化声明module_init(gpio_init)的?改为late_initcall(gpio_init)试试?
wwwunix 2010-09-20
  • 打赏
  • 举报
回复
关于驱动启动的顺序,给你一份参考文档,你可以看看:
http://hi.baidu.com/serial_story/blog/item/d40d49c6907212129c163ded.html
程序员小哈 2010-09-20
  • 打赏
  • 举报
回复
PA1默认是GPIO,估计第一个建议可能性不大,第二个建议,我同事就得改板了,先不打算尝试,我看楼主有这个建议:使用 late_initcall,木易可以教教我怎么用这个宏吗?我想把我的GPIO的优先级降低一点,谢谢啦
wwwunix 2010-09-20
  • 打赏
  • 举报
回复
建议:
1、查查datasheet,看看这个GPIO的引脚还可以用于什么?再查查相关的驱动程序。
2、在这个GPIO和蜂鸣器之间加一个锁存器。让GPIO引脚的变化不会影响到蜂鸣器。(因为这个引脚很可能是和其他设备共用的)
程序员小哈 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 jxj141 的回复:]
应该是在init和open之间有被其他驱动操作到?在init函数定义为late_initcall(),看启动还会一直响?
[/Quote]

查了一下资料没弄明白,该怎么做?late_initcall我查到是定义驱动优先级的,您的意思是让我的GPIO驱动最后加载对吗?我该把late_initcall放在哪里呢?不好意思,没有找到,还得麻烦您,我才能去测试一下效果,期待您的回复
jxj141 2010-09-20
  • 打赏
  • 举报
回复
应该是在init和open之间有被其他驱动操作到?在init函数定义为late_initcall(),看启动还会一直响?
程序员小哈 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jxj141 的回复:]
是不是寄存器默认的就是为低?
[/Quote]

我的驱动中的gpio_init,应该在Freeing init memory: 92K
前就已经挂载了吧?我已经at91_set_gpio_value(AT91_PINN_PA1,1);拉高了,为什么还会变低呢?能进一步指点一下吗?先谢谢啦
程序员小哈 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 armed 的回复:]
文件系统是独立于硬件的,不会修改GPIO的状态。

你可以在/etc/init.d/rcS中加上一个小程序,每有个动作就检测一下gpio的状态,看看是被哪个程序或模块修改了。
[/Quote]

在脚本rcS中怎么可以检测gpio状态呢?如果可以监测到,我怎么能发现有其他程序在运行呢?上哪里看呢?期待您的再次回复
jxj141 2010-09-20
  • 打赏
  • 举报
回复
是不是寄存器默认的就是为低?
armed 2010-09-20
  • 打赏
  • 举报
回复
文件系统是独立于硬件的,不会修改GPIO的状态。

你可以在/etc/init.d/rcS中加上一个小程序,每有个动作就检测一下gpio的状态,看看是被哪个程序或模块修改了。

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧