并口当GPIO用注意事项
时间:2009-06-22 来源:neilengineer
概述
在一个X86开发板上,要把并口当作GPIO来使用。
其硬件连接是:南桥芯片(ICH7)àsuperio芯片(smsc lpc47m997)à并口。其中,南桥芯片(ICH7)通过LPC总线和superio芯片相接。
LPC总线连接的superio芯片物理地址为:0x2e开始。0x2e是config port,0x2f是data port。
由ICH7芯片手册中的下表,知道并口地址为0x378-0x37F
500)this.width=500;" border=0>
由superio芯片(smsc lpc47m997)手册,知道0x378为Data Port,0x379为Status port:
500)this.width=500;" border=0>
现象
运行测试程序,发现其它功能如eth link led无法正常工作。
调试
分析和调试的过程中,主要使用了下面方法:
0)先上电,用万用表测量相关电压,确认硬件是否正常;
1)用硬件部提供的测试程序进行调试;
2)用自己的测试程序进行调试;
3)在驱动源码的合适地方加printk(主要打印并口状态)。
在整个调试过程中,都使用万用表测量并口相关针脚的电压,来确认驱动是否正常。
对于加printk方法,我在看门狗驱动中加入一定时间打印一下并口状态,如下:
int i=100;
void wd_feed(void)
{
//for debug
#if 1
i--;
if(i<0){
printk("%s###Debug: inb(PARALLEL_DATA_PORT)=0x%x \n", __FUNCTION__,inb(PARALLEL_DATA_PORT));
i=100;
}
#endif
。。。。。。
}
调试结果
1)内核启动完,直接测量相关电压,不正常;如在驱动中使能的使能位没有正常使能。
2)用硬件部提供的测试程序测试,一切正常;说明硬件没问题。
3)用自己的测试程序进行测试,也正常。
4)在内核启动的不同位置,打印并口的状态;发现GPIO和BCSR初始化时并口状态正常,但后来又不正常了。
分析
首先,硬件上没有问题。内核启动完时,相关电压不正常;但运行测试程序时相关电压正常。GPIO和BCSR模块初始化时并口状态正常,但后来又不正常了,说明:
1)GPIO相关驱动工作正常;
2)有东西把并口状态改变了。
经过分析,想起来开发板使用的内核是从官方网站下载的linux-2.6.28.9,在内核make menuconfig配置时,大部分使用默认设置,所以并口驱动以模块方式编译了。
解决
1)删除/lib/modules/2.6.28.9/kernel/driver/中编译好的模块(paraport目录中所有模块);
2)去掉内核配置中的并口驱动模块编译。
/*
*By Neil Chiao (neilchiao at gmail.com)
*转载请注明出处:neilengineer.cublog.cn
*欢迎访问:新星湾(www.xinxingwan.com)
*/