当前位置: 技术问答>linux和unix
挂载文件系统时,输出的GPIO引脚莫名的输出低电平,请大家帮忙进来看看
来源: 互联网 发布时间:2016-09-28
本文导语: 我使用at91rm9200,在YL9200开发板的基础上定制了自己的一个板子,系统和文件系统都是使用原开发板自带的:linux2.6.13和Cramfs,里面用QT2.3.7做了一个图形界面程序。我自己添加了一个GPIO驱动,用于控制IO的输出和输入...
我使用at91rm9200,在YL9200开发板的基础上定制了自己的一个板子,系统和文件系统都是使用原开发板自带的:linux2.6.13和Cramfs,里面用QT2.3.7做了一个图形界面程序。我自己添加了一个GPIO驱动,用于控制IO的输出和输入,现在输入没有问题,输出也可以正常控制,现在的问题是:我在驱动中已经设定输出和设置高电平了(我的蜂鸣器是低电平响)。在系统启动在下面过程时,蜂鸣器响,说明与蜂鸣器相连的引脚是低电平,这点我很困惑???在挂载文件系统的时候,有什么改变GPIO的输出电平吗?此时应该bios已经过去了,我的GPIO驱动也挂载完毕了吧?请大家解惑。
Freeing init memory: 92K这句开始,蜂鸣器就响啦--!
当启动我的程序,我Open我的驱动时,蜂鸣器就不响了,因为我在Open中将引脚电平至高了
驱动的init代码中我也强制至高了:
大家帮忙看看呗,现在系统一启动就嗡嗡响,好闹心啊,莫名其妙
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;
}
大家帮忙看看呗,现在系统一启动就嗡嗡响,好闹心啊,莫名其妙
|
应该是在init和open之间有被其他驱动操作到?在init函数定义为late_initcall(),看启动还会一直响?
|
文件系统是独立于硬件的,不会修改GPIO的状态。
你可以在/etc/init.d/rcS中加上一个小程序,每有个动作就检测一下gpio的状态,看看是被哪个程序或模块修改了。
你可以在/etc/init.d/rcS中加上一个小程序,每有个动作就检测一下gpio的状态,看看是被哪个程序或模块修改了。
|
是不是寄存器默认的就是为低?
|
建议:
1、查查datasheet,看看这个GPIO的引脚还可以用于什么?再查查相关的驱动程序。
2、在这个GPIO和蜂鸣器之间加一个锁存器。让GPIO引脚的变化不会影响到蜂鸣器。(因为这个引脚很可能是和其他设备共用的)
1、查查datasheet,看看这个GPIO的引脚还可以用于什么?再查查相关的驱动程序。
2、在这个GPIO和蜂鸣器之间加一个锁存器。让GPIO引脚的变化不会影响到蜂鸣器。(因为这个引脚很可能是和其他设备共用的)
|
关于驱动启动的顺序,给你一份参考文档,你可以看看:
http://hi.baidu.com/serial_story/blog/item/d40d49c6907212129c163ded.html
http://hi.baidu.com/serial_story/blog/item/d40d49c6907212129c163ded.html
|
驱动的初始化声明module_init(gpio_init)的?改为late_initcall(gpio_init)试试?
|
支持!
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。