📄 硬件驱动编程.htm
字号:
TX_FRAME_PORT,test_packet,(ETH_ZLEN+1) >>1);<BR><BR>if (net_debug >
1) printk("Sending test packet ");<BR>/* wait a couple of jiffies for packet
to be received */<BR>for (timenow = jiffies; jiffies - timenow < 60; )
;<BR>if (((event = readreg(dev, PP_TxEvent)) & TX_SEND_OK_BITS)
==TX_OK)<BR>{<BR>
if (net_debug > 1)
printk("succeeded\n");<BR>
return 1;<BR>}<BR>if (net_debug > 1) printk("failed \n");<BR>return
0;<BR>}<BR></P>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%">
这是一个测试程序,不仅过linux操作系统和上层TCP/IP,直接向网卡发数据包,来<BR>测试网卡是否工作正常,数组使用的标准的以太网帧格式(参见相关的RFC文档),不用管<BR>它,直接拿来就用的,这个数组的意思是向网络个点发包,网络点收到包好,进行回复.</P></BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"><BR><STRONG>问题 3
:</STRONG>我在别的一些cs89x0.c文件中看到这个函数是被detect_aui,detect_bnc等这样<BR>的函数所调用,但在uCcs8900.c中的detect_tp中没有用到?</P>
<BLOCKQUOTE>
<P
style="LINE-HEIGHT: 150%">BNC基本上现在网络都不用了,一般是RJ45的插头,你可以看一下现在的网卡,没有BNC<BR>头.AUI类似串口通信,尽管现在网卡都支持,但很少用到.所以这里只用了detect_tp()来检测RJ45连线是否存在.</P></BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"><BR><STRONG>问题 4
:</STRONG>这个函数里还用到了ETH_ALEN和ETH_ZLEN这两个宏,这两个宏的解释我看到过,但<BR>理解的不是很清楚,在这里test_packet,ETH_ALEN和ETH_ZLEN相互间是什么样的关系呢?<BR><BR>
ETH_ZLEN时所发数据包的长度,ETH_ALEN应该是6,是MAC地址的字结数.<BR></P>
<P style="LINE-HEIGHT: 150%"><STRONG>问题 5
:</STRONG>.驱动编译到内核里,生成映像文件当到目标板上让系统在目标板上运行起来后,<BR>该怎么测试我的驱动程序呢?需要再写相应的测试代码吗?<BR></P>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%">测试应该是两步:<BR>
1.底层硬件测试,可用它的send_test_pkt()来测,或自己写一个LOOPBACK测试程序,具体方法可参见CS89手册,test
mode.<BR><BR>2.上层网络测试,可用BSD写一个网络通信程序,开发板和PC及通信传送大量数据.<BR>或用linux上FTP服务来传送文件.<BR></P></BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"><STRONG>问题 6 :</STRONG>request_irq(IRQ_MACHSPEC |
20,<BR>
cs8900_interrupt,<BR>
IRQ_FLG_STD,<BR>
"CrystalLAN_cs8900a",
NULL))<BR>
panic("Unable to attach cs8900
intr\n");<BR><BR>
IRQ_MACHSPEC | 20,
该是硬件中断号,不知道为什么要这样写<BR>
IRQ_FLG_STD ,这个标志是要做些什么设置?中断共享等等?<BR></P>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%">IRQ_MACHSPEC | 20中20是硬件中断号, IRQ_MACHSPEC
应该是(0x10000000L),第一位1只是一个说明标志,说明是特殊设备中断.<BR>IRQ_FLG_STD是中断处理的一些属性设置,如快速,屏蔽等,我没有找到这个的定义,<BR>可能是标准中断处理吧.<BR></P>
<P style="LINE-HEIGHT: 150%" align=center><A
href="http://www.embhelp.com/drew/mypage/driver.htm#returntop"><B>返回页首</B></A></P></BLOCKQUOTE></BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"><A name=LCD></A><FONT color=black size=4><B>LCD
与触摸屏</B></FONT></P>
<TABLE width="100%" border=0>
<TBODY>
<TR>
<TD>
<P style="LINE-HEIGHT: 150%"><FONT color=black size=3><B>主题:LCD
与触摸屏分辨率不一样</B></FONT> </P></TD></TR></TBODY></TABLE>
<DIV align=right><!-- 文章内容显示 -->
<TABLE cellSpacing=0 cellPadding=10 width="100%" bgColor=#eeeeee border=0>
<TBODY>
<TR>
<TD>
<P style="LINE-HEIGHT: 150%"><FONT
color=black>我的LCD 分辨率与触摸屏的分辨率不一样, 但尺寸相同, 在触摸屏
<BR>上点击的坐标与LCD显示的坐标不一致, 请问有什么办法可 <BR>以解决(软件或硬件解决方案均可)。
<BR><BR> 环境: CodeWarrior for 68K, with PPSM
</FONT> </P></TD></TR></TBODY></TABLE>
<TABLE width="96%" border=0>
<TBODY>
<TR>
<TD class=t1>
<P style="LINE-HEIGHT: 150%"><B>Re:LCD
与触摸屏分辨率不一样</B> </P></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=10 width="96%" bgColor=#eeeeee border=0>
<TBODY>
<TR>
<TD>
<P
style="LINE-HEIGHT: 150%">LCD 分辨率与触摸屏的分辨率一般来说是不一样,坐标也不一样,这需要做程序进行转换.
<BR>我曾做过这样的转换,我的LCD分辨率是320*240,坐标原点在右下角. <BR>触摸屏分辨率是900*900,坐标原点在左上角.
<BR>计算公式如下: <BR>
<BR> xLCD=320-[320*(x-x2)/(x1-x2)];
<BR> yLCD=240-[240*(y-y2)/(y1-y2)];
<BR><BR>其实就是中学学的坐标转换.这种方法肯定能行的,试试看吧.</P></TD></TR></TBODY></TABLE></DIV>
<P style="LINE-HEIGHT: 150%" align=left>LCD 编程要点</P>
<P style="LINE-HEIGHT: 150%" align=left> </P>
<P style="LINE-HEIGHT: 150%" align=center> </P>
<P style="LINE-HEIGHT: 150%" align=center><A
href="http://www.embhelp.com/drew/mypage/driver.htm#returntop"><B>返回页首</B></A></P>
<P style="LINE-HEIGHT: 150%"> </P>
<P style="LINE-HEIGHT: 150%"><A name=MODEM></A><FONT color=black
size=5><B>Modem拨号</B></FONT></P>
<P style="LINE-HEIGHT: 150%"><FONT color=black size=4><B>
VxWorks下Modem拨号的主要实现过程</B></FONT></P>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%">这里用到一些串口RS232的定义和AT命令,Modem串口采用ns16552.主要步骤如下</P>
<P style="LINE-HEIGHT: 150%"><BR>1. off hook,发出摘机命令(ATH1\r),
<BR> 等待modem返回状态,如果是"OK",则表示成功.进行第二步.
<BR>2. on hook 发出挂机命令(ATH\r),
<BR> 等待modem返回状态,如果是"OK",则表示成功.进行第三步.
<BR>3. off hook,dialing,摘机拨号(ATDT....\r),
<BR> 等待modem返回状态,如果是"CONNECT",则表示成功.进行第四步.
<BR>4. send data,发送数据. <BR><BR>最好按上述步骤一步一步调,并要等待正确的返回值后再进行下一步.
<BR><BR>具体程序例子如下,拨号: <BR><BR>// 清空接收FIFO
<BR> REG(FCR, nsChan) |=FCR_RXCLR;
<BR>// 等待,直到清空为止
<BR> while((REG(FCR, nsChan) & FCR_RXCLR) != 0x00);
<BR>// 拨号
<BR> while(atdt1[i]!=0) <BR> {
<BR>// 检查发送FIFO是否准备好,为空 <BR>
while((REG(LSR, nsChan) & LSR_THRE) == 0x00);
<BR>// 在发送FIFO中放入数据 <BR>REG(THR, nsChan) = atdt1[i];
<BR>i++; <BR> } <BR>
<BR>// 等待是否有数据到达,即modem返回数据.
<BR>while((REG(LSR, nsChan) & LSR_DR) == 0x00);
<BR>// 接收数据并判断返回值 <BR>response[i-19]=REG(RBR,nsChan);
<BR> if(response[0]!=0x43)
<BR> ..................
<BR> else
<BR> ..................
<BR>// 如果返回值是"connect",
<BR> while(*data!=0) <BR> {
<BR>
while((REG(LSR, nsChan) & LSR_THRE) == 0x00);
<BR>REG(THR, nsChan) = *data++; <BR> }
<BR>其他步骤基本一样. <BR><BR></P>
<P style="LINE-HEIGHT: 150%"><STRONG>附:</STRONG> <STRONG>RS232(9
PINS)的主要定义:</STRONG></P>
<P style="LINE-HEIGHT: 150%" align=left> Pin 1:
DCD (Data Carrier Detect) Pin 2: RXD
(Receive) Pin 3: TXD (Transmit)</P>
<P style="LINE-HEIGHT: 150%" align=left> Pin 4:
DTR (Data Terminal Ready) Pin 5: SG (Signal Grund) Pin 6: DSR
(Data Set Ready)</P>
<P style="LINE-HEIGHT: 150%" align=left> Pin 7:
RTS (Request To Send) Pin 8: CTS (Clear To Send) Pin
9: RI (Ring Indicator)</P>
<P style="LINE-HEIGHT: 150%" align=left>
其中: DTE for Data Terminal Equipment, such as computer,
printer & terminal</P>
<P style="LINE-HEIGHT: 150%"
align=left>
DCE for Data Communication Equipment, such as modems.</P>
<P style="LINE-HEIGHT: 150%"
align=left>
+3 To +12 volts indicates On or O- state (space)</P>
<P style="LINE-HEIGHT: 150%"
align=left>
-3 To -12 volts indicates Off</P>
<P style="LINE-HEIGHT: 150%"
align=left>
Usually use swing between +12V~~-12V, dead area between +3V~~-3V</P>
<P style="LINE-HEIGHT: 150%"> </P>
<P style="LINE-HEIGHT: 150%" align=center><A
href="http://www.embhelp.com/drew/mypage/driver.htm#returntop"><B>返回页首</B></A></P></BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"> </P>
<P style="LINE-HEIGHT: 150%"><A
name=RTC></A><BIG><BIG><STRONG>RTC</STRONG></BIG></BIG></P>
<P style="LINE-HEIGHT: 150%"><FONT color=black size=3><B>怎样写PowerPc的Real-Time
Clock(RTC)的BSP?</B></FONT></P>
<BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%">
PowerPC 内部一般只有3个timer,没有内部RTC,PowerPC专门为外部RTC芯片设置了接口,一般外部RTC芯片是选择Dallas的,带有备用电源,通过SPI进行操作,可精确设置年月日时.... RTC驱动总的来说是不复杂的,只是要注意一些数据格式的转换,如BCD码等.
</P>
<P
style="LINE-HEIGHT: 150%">RTC一般有SPI接口和标准的三线接口,主要取决于管脚SERMODE,如果SERMODE接Vcc,则为SPI方式。SPI方式用到4个管脚:SDO,SDI,CE,SCLK.<BR><BR>三线制和SPI方式类似,只不过是用一个I/O管脚代替了SDO和SDI.
</P></BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%" align=center> </P>
<P style="LINE-HEIGHT: 150%" align=center><A
href="http://www.embhelp.com/drew/mypage/driver.htm#returntop"><B>返回页首</B></A></P>
<P style="LINE-HEIGHT: 150%" align=center> </P>
<P style="LINE-HEIGHT: 150%"><STRONG><BIG><BIG>PCI</BIG></BIG><BIG><BIG>驱动<A
name=PCI></A></BIG></BIG></STRONG></P>
<P style="LINE-HEIGHT: 150%"><FONT color=black size=3><B>PCI
驱动编程步骤</B></FONT></P>
<BLOCKQUOTE>
<P
style="LINE-HEIGHT: 150%">1。复制C:\Tornado\target\h\drv\pci目录下pciAutoConfigLib.h,pciConfigLib.h等PCI头文件文件和C:\Tornado\target\src\drv\pci目录下pciAutoConfigLib.c,pciConfigLib.c等PCI文件到BSP目录下。<BR><BR>2。根据实际的PCI硬件定义改写或从写这些PCI文件。<BR><BR>3。改写BSP配置文件<BR><BR>a.
在BSP 文件config.h中加入语句 #define INCLUDE_PCI (添加PCI模块)。<BR>b. 在BSP 文件sysLib.c中加入语句
#include "pci/pciConfigLib.c"(主要PCI初始化函数在这个文件中)。<BR>c。在BSP 文件sysLib.c中加入语句
IMPORT void sysOutLong(); (导入PCI需要的一些基本函数)。<BR>IMPORT char
sysInByte();<BR>IMPORT char
sysOutByte();<BR>...................</P></BLOCKQUOTE>
<P style="LINE-HEIGHT: 150%"> </P>
<P style="LINE-HEIGHT: 150%" align=center><A
href="http://www.embhelp.com/drew/mypage/driver.htm#returntop"><B>返回页首</B></A></P>
<P style="LINE-HEIGHT: 150%" align=center> </P></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -