[ZLG-ARM] AX88796驱动移植

[复制链接]
 楼主| reeper 发表于 2009-4-6 17:12 | 显示全部楼层 |阅读模式
&nbsp;&nbsp;一个Bootloader没有tftp的支持,那么移植内核实在是痛苦的事。因为你要不断的用串口烧写内核到SDRAM里,时间少则2分多钟,多则4分多钟,错了还要重烧!在实现这个驱动前,我用U-Boot就是这么痛苦。<br />&nbsp;&nbsp;&nbsp;&nbsp;在移植完Linux2.6.22.2的AX88796的驱动之后,我决心一定要把AX88796移植到U-Boot上,一劳永逸。借助移植Linux下的AX88796的经验,我首先看懂了/drivers下的ne2000.c的驱动,再参考了一些RTL8019的移植记录(都是NE2000兼容网卡),在痛苦了三四天后,驱动成功,ping和tftp成功,高兴得差点跳起来!以下介绍驱动的移植和U-Boot下网卡驱动移植、编写的一般方法。<br />U-Boot下网卡驱动框架:<br />&nbsp;&nbsp;&nbsp;U-Boot的/drivers文件夹包含了许多U-Boot可能用到的驱动,其中包括:nand&nbsp;flash和网卡。(如果你有修改过nand&nbsp;flash驱动,你一定来过这。)这些驱动基本上都是最底层的硬件驱动。网卡驱动也不例外,它并不包含协议层,只实现网卡初始化、读写、停止等等功能,所以移植起来比较容易。<br />U-Boot网卡驱动的接口函数由以下四个函数组成:<br /><br />int&nbsp;eth_init(bd_t&nbsp;*bd):完成网卡初始化的过程:热复位、相应寄存器的赋值、设置MAC地址等等<br />void&nbsp;eth_halt()&nbsp;:停止网卡运行<br />int&nbsp;eth_rx()&nbsp;:接收网络数据<br />int&nbsp;eth_send(volatile&nbsp;void&nbsp;*packet,&nbsp;int&nbsp;length)&nbsp;:发送数据<br /><br />U-Boot在进行网络操作时,调用的就是这四个函数。所以移植时,只要集中精力在这四个函数,使它们对网卡的操作是正确的,移植就成功了。知道以上的知识,再学习一些网卡和网络的知识,看看成功的网卡驱动,要是以后出现U-boot不支持的网卡,也可以自己写驱动了!<br /><br />--------------------------------------------------------------------------------<br />U-Boot下AX88796网卡移植过程<br />&nbsp;&nbsp;&nbsp;&nbsp;U-Boot下的AX88796网卡(NE2000寄存器兼容)驱动是使用NE2000的驱动,用到的文件是在/drivers文件夹下的8390.h、ne2000.c和ne2000.h。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;首先说明一个关键问题,U-Boot的NE2000驱动是为8位总线写的,而博创的2410-S实验箱的AX88796的硬件连接适合16位总线的网卡驱动。所以必须将NE2000驱动该写成16位总线的驱动。(也许你会想:我也可以把2410的总线宽度改成8位,来使用8位的驱动。但是请你注意看看AX88796的数据手册的第51页和实验箱原理图的网卡部分,你就会知道:即使你用8位的驱动,你也必须使用16位&nbsp;的总线,而且数据会处理更加麻烦。)还有就是没有修改过的驱动有BUG,没有修正是无法正常使用的。&nbsp;<br />--------------------------------------------------------------------------------<br /><br /><br />(1)修改ne2000.c<br />......<br />#define&nbsp;DEBUG&nbsp;0<br /><br />#if&nbsp;DEBUG&nbsp;&&nbsp;1<br />#define&nbsp;DEBUG_FUNCTION()&nbsp;do&nbsp;{&nbsp;printf('%s<br />',&nbsp;__FUNCTION__);&nbsp;}&nbsp;while&nbsp;(0)<br />#define&nbsp;DEBUG_LINE()&nbsp;do&nbsp;{&nbsp;printf('%d<br />',&nbsp;__LINE__);&nbsp;}&nbsp;while&nbsp;(0)<br />#else<br />#define&nbsp;DEBUG_FUNCTION()&nbsp;do&nbsp;{}&nbsp;while(0)<br />#define&nbsp;DEBUG_LINE()&nbsp;do&nbsp;{}&nbsp;while(0)<br />#endif<br /><br />#include&nbsp;'ne2000.h'<br />//将8390的头文件上移到此,因为前面就要用到<br />#include&nbsp;'8390.h'<br /><br />#if&nbsp;DEBUG&nbsp;&&nbsp;1<br />#define&nbsp;PRINTK(args...)&nbsp;printf(args)<br />#else<br />#define&nbsp;PRINTK(args...)<br />#endif<br /><br />static&nbsp;dp83902a_priv_data_t&nbsp;nic;&nbsp;/*&nbsp;just&nbsp;one&nbsp;instance&nbsp;of&nbsp;the&nbsp;card&nbsp;supported&nbsp;*/<br /><br />//添加从U-Boot的参数区读取MAC地址的函数<br />static&nbsp;int<br />ne2000_read_mac_addr(unsigned&nbsp;char&nbsp;*&nbsp;enaddr)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ii;<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*s,&nbsp;*e;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;getenv&nbsp;('ethaddr');<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s&nbsp;==&nbsp;NULL){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;else{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(ii&nbsp;=&nbsp;0;&nbsp;ii&nbsp;&lt&nbsp;12;&nbsp;ii+=2)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enaddr[ii]&nbsp;=enaddr[ii+1]=&nbsp;s&nbsp;?&nbsp;simple_strtoul&nbsp;(s,&nbsp;&e,&nbsp;16)&nbsp;:&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(s){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;(*e)&nbsp;?&nbsp;e&nbsp;+&nbsp;1&nbsp;:&nbsp;e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br />......<br /><br />static&nbsp;void<br />dp83902a_start(unsigned&nbsp;char&nbsp;*&nbsp;enaddr)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;dp83902a_priv_data_t&nbsp;*dp&nbsp;=&nbsp;&nic;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint8&nbsp;*base&nbsp;=&nbsp;dp-&gtbase;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;DEBUG_FUNCTION();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_CR,&nbsp;DP_CR_PAGE0&nbsp;|&nbsp;DP_CR_NODMA&nbsp;|&nbsp;DP_CR_STOP);&nbsp;/*&nbsp;Brutal&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_DCR,&nbsp;0x49);&nbsp;//将网卡的总线宽度改为16位<br />&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_RBCH,&nbsp;0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Remote&nbsp;byte&nbsp;count&nbsp;*/<br /><br /><br />......<br /><br />DP_OUT(base,&nbsp;DP_CR,&nbsp;DP_CR_PAGE0&nbsp;|&nbsp;DP_CR_NODMA&nbsp;|&nbsp;DP_CR_STOP);<br />&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_TCR,&nbsp;DP_TCR_NORMAL);&nbsp;/*&nbsp;Normal&nbsp;transmit&nbsp;operations&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_RCR,&nbsp;DP_RCR_AB);&nbsp;&nbsp;/*&nbsp;Accept&nbsp;broadcast,&nbsp;no&nbsp;errors,&nbsp;no&nbsp;multicast&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_CR,&nbsp;DP_CR_PAGE0&nbsp;|&nbsp;DP_CR_NODMA&nbsp;|&nbsp;DP_CR_START);<br />&nbsp;&nbsp;&nbsp;&nbsp;dp-&gtrunning&nbsp;=&nbsp;true;<br />}<br /><br />......<br /><br />static&nbsp;void<br />dp83902a_send(unsigned&nbsp;short&nbsp;*data,&nbsp;int&nbsp;total_len,&nbsp;unsigned&nbsp;long&nbsp;key)<br />{<br />......<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_ISR,&nbsp;DP_ISR_RDC);&nbsp;&nbsp;/*&nbsp;Clear&nbsp;end&nbsp;of&nbsp;DMA&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Dummy&nbsp;read.&nbsp;The&nbsp;manual&nbsp;sez&nbsp;something&nbsp;slightly&nbsp;different,&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;but&nbsp;the&nbsp;code&nbsp;is&nbsp;extended&nbsp;a&nbsp;bit&nbsp;to&nbsp;do&nbsp;what&nbsp;Hitachi's&nbsp;monitor&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;does&nbsp;(i.e.,&nbsp;also&nbsp;read&nbsp;data).&nbsp;*/<br />/*&nbsp;&nbsp;&nbsp;&nbsp;//屏蔽无用的语句<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;len&nbsp;=&nbsp;1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_RSAL,&nbsp;0x100-len);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_RSAH,&nbsp;(start_page-1)&nbsp;&&nbsp;0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_RBCL,&nbsp;len);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_RBCH,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_CR,&nbsp;DP_CR_PAGE0&nbsp;|&nbsp;DP_CR_RDMA&nbsp;|&nbsp;DP_CR_START);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_IN_DATA(dp-&gtdata,&nbsp;tmp);<br />*/&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />......<br /><br />#if&nbsp;DEBUG&nbsp;&&nbsp;4<br />&nbsp;&nbsp;&nbsp;&nbsp;printf('&nbsp;sg&nbsp;buf&nbsp;%08lx&nbsp;len&nbsp;%08x<br />',&nbsp;(unsigned&nbsp;long)&nbsp;data,&nbsp;len);<br />&nbsp;&nbsp;&nbsp;&nbsp;dx&nbsp;=&nbsp;0;<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(len&nbsp;&gt&nbsp;1)&nbsp;{<br />#if&nbsp;DEBUG&nbsp;&&nbsp;4<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('&nbsp;%04x',&nbsp;*data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(0&nbsp;==&nbsp;(++dx&nbsp;%&nbsp;16))&nbsp;printf('<br />');<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT_DATA(dp-&gtdata,&nbsp;*data++);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len-=2;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />#if&nbsp;DEBUG&nbsp;&&nbsp;4<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(len==1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('&nbsp;%04x',&nbsp;(*data)&0xff);<br />&nbsp;&nbsp;&nbsp;&nbsp;printf('<br />');<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(len==1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{DP_OUT_DATA(dp-&gtdata,&nbsp;(*data++)&0xff);&nbsp;&nbsp;&nbsp;&nbsp;total_len++;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(total_len&nbsp;&lt&nbsp;pkt_len)&nbsp;{<br />#if&nbsp;DEBUG&nbsp;&&nbsp;4<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('&nbsp;&nbsp;+&nbsp;%d&nbsp;bytes&nbsp;of&nbsp;padding<br />',&nbsp;pkt_len&nbsp;-&nbsp;total_len);<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Padding&nbsp;to&nbsp;802.3&nbsp;length&nbsp;was&nbsp;required&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;total_len;&nbsp;&nbsp;i&nbsp;&lt&nbsp;pkt_len;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i+=2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT_DATA(dp-&gtdata,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />......<br />}<br /><br />/*<br />&nbsp;&nbsp;This&nbsp;function&nbsp;is&nbsp;called&nbsp;when&nbsp;a&nbsp;packet&nbsp;has&nbsp;been&nbsp;received.&nbsp;&nbsp;It's&nbsp;job&nbsp;is<br />&nbsp;&nbsp;to&nbsp;prepare&nbsp;to&nbsp;unload&nbsp;the&nbsp;packet&nbsp;from&nbsp;the&nbsp;hardware.&nbsp;&nbsp;Once&nbsp;the&nbsp;length&nbsp;of<br />&nbsp;&nbsp;the&nbsp;packet&nbsp;is&nbsp;known,&nbsp;the&nbsp;upper&nbsp;layer&nbsp;of&nbsp;the&nbsp;driver&nbsp;can&nbsp;be&nbsp;told.&nbsp;&nbsp;When<br />&nbsp;&nbsp;the&nbsp;upper&nbsp;layer&nbsp;is&nbsp;ready&nbsp;to&nbsp;unload&nbsp;the&nbsp;packet,&nbsp;the&nbsp;internal&nbsp;function<br />&nbsp;&nbsp;'dp83902a_recv'&nbsp;will&nbsp;be&nbsp;called&nbsp;to&nbsp;actually&nbsp;fetch&nbsp;it&nbsp;from&nbsp;the&nbsp;hardware.<br />*/<br />static&nbsp;void<br />dp83902a_RxEvent(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;dp83902a_priv_data&nbsp;*dp&nbsp;=&nbsp;(struct&nbsp;dp83902a_priv_data&nbsp;*)&nbsp;&nic;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint8&nbsp;*base&nbsp;=&nbsp;dp-&gtbase;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;rsr;<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;short&nbsp;rcv_hdr[2];<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i,&nbsp;len,&nbsp;pkt,&nbsp;cur;<br />......<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_RBCL,&nbsp;4);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_RBCH,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_RSAL,&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_RSAH,&nbsp;pkt);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(dp-&gtrx_next&nbsp;==&nbsp;pkt)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(cur&nbsp;==&nbsp;dp-&gtrx_buf_start)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_BNDRY,&nbsp;dp-&gtrx_buf_end-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_BNDRY,&nbsp;cur-1);&nbsp;/*&nbsp;Update&nbsp;pointer&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp-&gtrx_next&nbsp;=&nbsp;pkt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_ISR,&nbsp;DP_ISR_RDC);&nbsp;/*&nbsp;Clear&nbsp;end&nbsp;of&nbsp;DMA&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_CR,&nbsp;DP_CR_RDMA&nbsp;|&nbsp;DP_CR_START);<br />#ifdef&nbsp;CYGHWR_NS_DP83902A_PLF_BROKEN_RX_DMA<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CYGACC_CALL_IF_DELAY_US(10);<br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;&nbsp;i&nbsp;&lt&nbsp;sizeof(rcv_hdr);)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_IN_DATA(dp-&gtdata,&nbsp;rcv_hdr[i++]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />#if&nbsp;DEBUG&nbsp;&&nbsp;5<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('rx&nbsp;hdr&nbsp;%04x&nbsp;%04x&nbsp;<br />',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rcv_hdr[0],&nbsp;rcv_hdr[1]);<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len&nbsp;=&nbsp;rcv_hdr[1]&nbsp;-&nbsp;4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uboot_push_packet_len(len);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(((rcv_hdr[0]&nbsp;&gt&gt8)&0xff)&nbsp;==&nbsp;dp-&gtrx_buf_start)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_BNDRY,&nbsp;dp-&gtrx_buf_end-1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_BNDRY,&nbsp;((rcv_hdr[0]&nbsp;&gt&gt8)&0xff)-1);&nbsp;/*&nbsp;Update&nbsp;pointer&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />/*<br />&nbsp;&nbsp;This&nbsp;function&nbsp;is&nbsp;called&nbsp;as&nbsp;a&nbsp;result&nbsp;of&nbsp;the&nbsp;'eth_drv_recv()'&nbsp;call&nbsp;above.<br />&nbsp;&nbsp;It's&nbsp;job&nbsp;is&nbsp;to&nbsp;actually&nbsp;fetch&nbsp;data&nbsp;for&nbsp;a&nbsp;packet&nbsp;from&nbsp;the&nbsp;hardware&nbsp;once<br />&nbsp;&nbsp;memory&nbsp;buffers&nbsp;have&nbsp;been&nbsp;allocated&nbsp;for&nbsp;the&nbsp;packet.&nbsp;&nbsp;Note&nbsp;that&nbsp;the&nbsp;buffers<br />&nbsp;&nbsp;may&nbsp;come&nbsp;in&nbsp;pieces,&nbsp;using&nbsp;a&nbsp;scatter-gather&nbsp;list.&nbsp;&nbsp;This&nbsp;allows&nbsp;for&nbsp;more<br />&nbsp;&nbsp;efficient&nbsp;processing&nbsp;in&nbsp;the&nbsp;upper&nbsp;layers&nbsp;of&nbsp;the&nbsp;stack.<br />*/<br />static&nbsp;void<br />dp83902a_recv(unsigned&nbsp;short&nbsp;*data,&nbsp;int&nbsp;len)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;......<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Read&nbsp;incoming&nbsp;packet&nbsp;data&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_CR,&nbsp;DP_CR_PAGE0&nbsp;|&nbsp;DP_CR_NODMA&nbsp;|&nbsp;DP_CR_START);<br />&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_RBCL,&nbsp;len&nbsp;&&nbsp;0xFF);<br />&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_RBCH,&nbsp;(len&nbsp;&gt&gt&nbsp;8)&&nbsp;0xFF);<br />&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_RSAL,&nbsp;4);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Past&nbsp;header&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_RSAH,&nbsp;dp-&gtrx_next);<br />&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_ISR,&nbsp;DP_ISR_RDC);&nbsp;/*&nbsp;Clear&nbsp;end&nbsp;of&nbsp;DMA&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;DP_OUT(base,&nbsp;DP_CR,&nbsp;DP_CR_RDMA&nbsp;|&nbsp;DP_CR_START);<br />#ifdef&nbsp;CYGHWR_NS_DP83902A_PLF_BROKEN_RX_DMA<br />&nbsp;&nbsp;&nbsp;&nbsp;CYGACC_CALL_IF_DELAY_US(10);<br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;saved&nbsp;=&nbsp;false;<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;&nbsp;i&nbsp;&lt&nbsp;1;&nbsp;&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(data)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mlen&nbsp;=&nbsp;len;<br />#if&nbsp;DEBUG&nbsp;&&nbsp;4<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('&nbsp;sg&nbsp;buf&nbsp;%08lx&nbsp;len&nbsp;%08x&nbsp;<br />',&nbsp;(unsigned&nbsp;long)&nbsp;data,&nbsp;mlen);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dx&nbsp;=&nbsp;0;<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(0&nbsp;&lt&nbsp;mlen)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Saved&nbsp;byte&nbsp;from&nbsp;previous&nbsp;loop?&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(saved)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*data++&nbsp;=&nbsp;saved_char;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mlen--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;saved&nbsp;=&nbsp;false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_IN_DATA(dp-&gtdata,&nbsp;tmp);<br />#if&nbsp;DEBUG&nbsp;&&nbsp;4<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('&nbsp;%04x',&nbsp;tmp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(0&nbsp;==&nbsp;(++dx&nbsp;%&nbsp;16))&nbsp;printf('<br />');<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*data++&nbsp;=&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mlen-=2;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(mlen==1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DP_IN_DATA(dp-&gtdata,&nbsp;tmp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;=&nbsp;tmp&nbsp;&&nbsp;0xff;<br />#if&nbsp;DEBUG&nbsp;&&nbsp;4<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('&nbsp;%04x',&nbsp;tmp);<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*data++&nbsp;=&nbsp;tmp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mlen--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />#if&nbsp;DEBUG&nbsp;&&nbsp;4<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('<br />');<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />......<br />//添加自定义的AX88796硬件信息,在这里定义了如果网卡的MAC地址的前三个为&nbsp;<br />//0x08,&nbsp;0x08,&nbsp;0x08,那就是AX88796。如果你要修改MAC地址&nbsp;,<br />//最好前三个要和这三个一样,不然驱动会认不到网卡。<br />static&nbsp;hw_info_t&nbsp;hw_info[]&nbsp;=&nbsp;{<br />......<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;/*&nbsp;NE2000&nbsp;Compatible&nbsp;*/&nbsp;0x0ff0,&nbsp;0x00,&nbsp;0xa0,&nbsp;0x0c,&nbsp;0&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;/*&nbsp;AX88796&nbsp;*/&nbsp;0x0ff0,&nbsp;0x08,&nbsp;0x08,&nbsp;0x08,&nbsp;0&nbsp;},<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;/*&nbsp;Network&nbsp;General&nbsp;Sniffer&nbsp;*/&nbsp;0x0ff0,&nbsp;0x00,&nbsp;0x00,&nbsp;0x65,<br />......<br />};<br /><br />......<br /><br />static&nbsp;void&nbsp;pcnet_reset_8390(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i,&nbsp;r;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;PRINTK('nic&nbsp;base&nbsp;is&nbsp;%lx<br />',&nbsp;nic_base);<br /><br />#if&nbsp;1<br />&nbsp;&nbsp;&nbsp;&nbsp;n2k_outb(E8390_NODMA+E8390_PAGE0+E8390_STOP,&nbsp;E8390_CMD);<br />&nbsp;&nbsp;&nbsp;&nbsp;PRINTK('cmd&nbsp;(at&nbsp;%lx)&nbsp;is&nbsp;%x<br />',&nbsp;nic_base+&nbsp;E8390_CMD,&nbsp;n2k_inb(E8390_CMD));<br />&nbsp;&nbsp;&nbsp;&nbsp;n2k_outb(E8390_NODMA+E8390_PAGE1+E8390_STOP,&nbsp;E8390_CMD);<br />&nbsp;&nbsp;&nbsp;&nbsp;PRINTK('cmd&nbsp;(at&nbsp;%lx)&nbsp;is&nbsp;%x<br />',&nbsp;nic_base+&nbsp;E8390_CMD,&nbsp;n2k_inb(E8390_CMD));<br />&nbsp;&nbsp;&nbsp;&nbsp;n2k_outb(E8390_NODMA+E8390_PAGE0+E8390_STOP,&nbsp;E8390_CMD);<br />&nbsp;&nbsp;&nbsp;&nbsp;PRINTK('cmd&nbsp;(at&nbsp;%lx)&nbsp;is&nbsp;%x<br />',&nbsp;nic_base+&nbsp;E8390_CMD,&nbsp;n2k_inb(E8390_CMD));<br />#endif<br />&nbsp;&nbsp;&nbsp;&nbsp;n2k_outb(E8390_NODMA+E8390_PAGE0+E8390_STOP,&nbsp;E8390_CMD);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;n2k_outb(n2k_inb(PCNET_RESET),&nbsp;PCNET_RESET);&nbsp;&nbsp;&nbsp;<br />//低级错误,严重的BUG,没有修改无法实现网卡的热复位,晕死。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;100;&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((r&nbsp;=&nbsp;(n2k_inb(EN0_ISR)&nbsp;&&nbsp;ENISR_RESET))&nbsp;!=&nbsp;0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINTK('got&nbsp;%x&nbsp;in&nbsp;reset<br />',&nbsp;r);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my_udelay(100);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;n2k_outb(0xff,&nbsp;EN0_ISR);&nbsp;/*&nbsp;Ack&nbsp;intr.&nbsp;*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(i&nbsp;==&nbsp;100)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('pcnet_reset_8390()&nbsp;did&nbsp;not&nbsp;complete.<br />');<br />}&nbsp;/*&nbsp;pcnet_reset_8390&nbsp;*/<br /><br />static&nbsp;hw_info_t&nbsp;*&nbsp;get_prom(void&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;prom[32];<br />&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;ethaddr[20];&nbsp;&nbsp;&nbsp;&nbsp;//tekkaman<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i,&nbsp;j,&nbsp;tekkaman;&nbsp;&nbsp;&nbsp;&nbsp;//tekkaman<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;ne_defethaddr[]={0x08,0x08,0x08,0x08,0x12,0x27,0};//tekkaman<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;......<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;pcnet_reset_8390();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;mdelay(10);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;sizeof(program_seq)/sizeof(program_seq[0]);&nbsp;i++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n2k_outb(program_seq.value,&nbsp;program_seq.offset);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;tekkaman=ne2000_read_mac_addr(prom);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(tekkaman)&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('ethaddr&nbsp;in&nbsp;nand&nbsp;is&nbsp;not&nbsp;found&nbsp;,loading&nbsp;ne_defethaddr:');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;12;&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prom&nbsp;=&nbsp;ne_defethaddr[i/2];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('&nbsp;%02x',&nbsp;prom);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;prom[28]&nbsp;=&nbsp;prom[30]&nbsp;=&nbsp;0x57;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;PRINTK('<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt&nbsp;NR_INFO;&nbsp;i++)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((prom[0]&nbsp;==&nbsp;hw_info.a0)&nbsp;&&<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(prom[2]&nbsp;==&nbsp;hw_info.a1)&nbsp;&&<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(prom[4]&nbsp;==&nbsp;hw_info.a2))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINTK('matched&nbsp;board&nbsp;%d<br />',&nbsp;i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((i&nbsp;&lt&nbsp;NR_INFO)&nbsp;||&nbsp;((prom[28]&nbsp;==&nbsp;0x57)&nbsp;&&&nbsp;(prom[30]&nbsp;==&nbsp;0x57)))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(j&nbsp;=&nbsp;0;&nbsp;j&nbsp;&lt&nbsp;6;&nbsp;j++)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev_addr[j]&nbsp;=&nbsp;prom[j&lt&lt1];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINTK('on&nbsp;exit&nbsp;i&nbsp;is&nbsp;%d/%ld<br />',&nbsp;i,&nbsp;NR_INFO);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINTK('MAC&nbsp;address&nbsp;is&nbsp;%02x:%02x:%02x:%02x:%02x:%02x<br />',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev_addr[0],dev_addr[1],dev_addr[2],dev_addr[3],dev_addr[4],dev_addr[5]);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;(i&nbsp;&lt&nbsp;NR_INFO)&nbsp;?&nbsp;hw_info+i&nbsp;:&nbsp;&default_info;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(tekkaman)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sprintf&nbsp;(ethaddr,&nbsp;'%02X:%02X:%02X:%02X:%02X:%02X',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev_addr[0],&nbsp;dev_addr[1],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev_addr[2],&nbsp;dev_addr[3],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev_addr[4],&nbsp;dev_addr[5])&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('Set&nbsp;environment&nbsp;from&nbsp;HW&nbsp;MAC&nbsp;addr&nbsp;=&nbsp;'%s'<br />',&nbsp;ethaddr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setenv&nbsp;('ethaddr',&nbsp;ethaddr);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;NULL;<br />}<br /><br />/*&nbsp;U-boot&nbsp;specific&nbsp;routines&nbsp;*/<br /><br />#define&nbsp;NB&nbsp;5<br /><br />static&nbsp;unsigned&nbsp;short&nbsp;*pbuf&nbsp;=&nbsp;NULL;<br />static&nbsp;int&nbsp;plen[NB];<br />static&nbsp;int&nbsp;nrx&nbsp;=&nbsp;0;<br /><br />static&nbsp;int&nbsp;pkey&nbsp;=&nbsp;-1;<br /><br />void&nbsp;uboot_push_packet_len(int&nbsp;len)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;PRINTK('pushed&nbsp;len&nbsp;=&nbsp;%d,&nbsp;nrx&nbsp;=&nbsp;%d<br />',&nbsp;len,&nbsp;nrx);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(len&gt=2000)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('NE2000:&nbsp;packet&nbsp;too&nbsp;big<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(nrx&nbsp;&gt=&nbsp;NB)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('losing&nbsp;packets&nbsp;in&nbsp;rx<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;plen[nrx]&nbsp;=&nbsp;len;<br />&nbsp;&nbsp;&nbsp;&nbsp;dp83902a_recv(&pbuf[nrx*1000],&nbsp;len);<br />&nbsp;&nbsp;&nbsp;&nbsp;nrx++;<br />}<br /><br />void&nbsp;uboot_push_tx_done(int&nbsp;key,&nbsp;int&nbsp;val)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;PRINTK('pushed&nbsp;key&nbsp;=&nbsp;%d<br />',&nbsp;key);<br />&nbsp;&nbsp;&nbsp;&nbsp;pkey&nbsp;=&nbsp;key;<br />}<br /><br />int&nbsp;eth_init(bd_t&nbsp;*bd)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;hw_info_t&nbsp;*&nbsp;r;<br />//&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;ethaddr[20];<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;PRINTK('###&nbsp;eth_init<br />');<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!pbuf)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pbuf&nbsp;=&nbsp;malloc(NB*1000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!pbuf)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('Cannot&nbsp;allocate&nbsp;rx&nbsp;buffers<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />#ifdef&nbsp;CONFIG_DRIVER_NE2000_CCR<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;unsigned&nbsp;char&nbsp;*p&nbsp;=&nbsp;&nbsp;(volatile&nbsp;unsigned&nbsp;char&nbsp;*)&nbsp;CONFIG_DRIVER_NE2000_CCR;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINTK('CCR&nbsp;before&nbsp;is&nbsp;%x<br />',&nbsp;*p);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*p&nbsp;=&nbsp;CONFIG_DRIVER_NE2000_VAL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINTK('CCR&nbsp;after&nbsp;is&nbsp;%x<br />',&nbsp;*p);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />#endif<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;nic_base&nbsp;=&nbsp;CONFIG_DRIVER_NE2000_BASE;<br />&nbsp;&nbsp;&nbsp;&nbsp;nic.base&nbsp;=&nbsp;(cyg_uint8&nbsp;*)&nbsp;CONFIG_DRIVER_NE2000_BASE;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;r&nbsp;=&nbsp;get_prom();<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!r)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />/*//屏蔽无用的语句<br />&nbsp;&nbsp;&nbsp;&nbsp;sprintf&nbsp;(ethaddr,&nbsp;'%02X:%02X:%02X:%02X:%02X:%02X',<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev_addr[0],&nbsp;dev_addr[1],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev_addr[2],&nbsp;dev_addr[3],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dev_addr[4],&nbsp;dev_addr[5])&nbsp;;<br />&nbsp;&nbsp;&nbsp;PRINTK('Set&nbsp;environment&nbsp;from&nbsp;HW&nbsp;MAC&nbsp;addr&nbsp;=&nbsp;'%s'<br />',&nbsp;ethaddr);<br />&nbsp;&nbsp;&nbsp;&nbsp;setenv&nbsp;('ethaddr',&nbsp;ethaddr);<br />*/<br /><br />#define&nbsp;DP_DATA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x10<br />&nbsp;&nbsp;&nbsp;&nbsp;nic.data&nbsp;=&nbsp;(unsigned&nbsp;short&nbsp;*)&nbsp;(nic.base&nbsp;+&nbsp;DP_DATA);<br />&nbsp;&nbsp;&nbsp;&nbsp;nic.tx_buf1&nbsp;=&nbsp;0x40;<br />&nbsp;&nbsp;&nbsp;&nbsp;nic.tx_buf2&nbsp;=&nbsp;0x46;<br />&nbsp;&nbsp;&nbsp;&nbsp;nic.rx_buf_start&nbsp;=&nbsp;0x4C;<br />&nbsp;&nbsp;&nbsp;&nbsp;nic.rx_buf_end&nbsp;=&nbsp;0x80;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;dp83902a_start(dev_addr);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(dp83902a_init()&nbsp;==&nbsp;false)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br />void&nbsp;eth_halt()&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;PRINTK('###&nbsp;eth_halt<br />');<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;dp83902a_stop();<br />}<br /><br />int&nbsp;eth_rx()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;j,&nbsp;tmo;<br />&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;uchar&nbsp;*&nbsp;inpkt<br />&nbsp;&nbsp;&nbsp;&nbsp;PRINTK('###&nbsp;eth_rx<br />');<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;tmo&nbsp;=&nbsp;get_timer&nbsp;(0)&nbsp;+&nbsp;TOUT&nbsp;*&nbsp;CFG_HZ;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp83902a_poll();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(nrx&nbsp;&gt&nbsp;0)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(j=0;&nbsp;j&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inpkt&nbsp;=&nbsp;(uchar&nbsp;*)&nbsp;&pbuf[j*1000];<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NetReceive(inpkt,&nbsp;plen[j]);//这句的作用就是将接收到的数据<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//送到MAC层以上的协议层<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nrx&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(get_timer&nbsp;(0)&nbsp;&gt=&nbsp;tmo)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('timeout&nbsp;during&nbsp;rx<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br />int&nbsp;eth_send(volatile&nbsp;void&nbsp;*packet,&nbsp;int&nbsp;length)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;tmo;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;PRINTK('###&nbsp;eth_send<br />');<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;pkey&nbsp;=&nbsp;-1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;dp83902a_send((unsigned&nbsp;short&nbsp;*)&nbsp;packet,&nbsp;length,&nbsp;666);<br />&nbsp;&nbsp;&nbsp;&nbsp;tmo&nbsp;=&nbsp;get_timer&nbsp;(0)&nbsp;+&nbsp;TOUT&nbsp;*&nbsp;CFG_HZ;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dp83902a_poll();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(pkey&nbsp;!=&nbsp;-1)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PRINTK('Packet&nbsp;sucesfully&nbsp;sent<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(get_timer&nbsp;(0)&nbsp;&gt=&nbsp;tmo)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf('transmission&nbsp;error&nbsp;(timoeut)<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;0;<br />}<br /><br />#endif<br /><br />ne2000.c修改完毕&nbsp;<br /><br /><br /><br />--------------------------------------------------------------------------------<br /><br /><br /><br /><br />(2)修改ne2000.h<br />NE2000驱动的低级错误<br />将第45行:<br />at&nbsp;http://sources.redhat.com/ecos/ecos-license/&nbsp;*/<br /><br />改为:<br />at&nbsp;http://sources.redhat.com/ecos/ecos-license/&nbsp;<br /><br />就是去掉“*/”&nbsp;&nbsp;&nbsp;,&nbsp;&nbsp;&nbsp;真是TNND汗死!!!!<br /><br />......<br /><br />#define&nbsp;DP_IN(_b_,&nbsp;_o_,&nbsp;_d_)&nbsp;&nbsp;(_d_)&nbsp;=&nbsp;*(&nbsp;(volatile&nbsp;unsigned&nbsp;char&nbsp;*)&nbsp;((_b_)+(_o_)))<br />#define&nbsp;DP_OUT(_b_,&nbsp;_o_,&nbsp;_d_)&nbsp;*(&nbsp;(volatile&nbsp;unsigned&nbsp;char&nbsp;*)&nbsp;((_b_)+(_o_)))&nbsp;=&nbsp;((unsigned&nbsp;char)&nbsp;(_d_))<br /><br />#define&nbsp;DP_IN_DATA(_b_,&nbsp;_d_)&nbsp;&nbsp;(_d_)&nbsp;=&nbsp;*(&nbsp;(volatile&nbsp;unsigned&nbsp;short&nbsp;*)&nbsp;((_b_)))<br />#define&nbsp;DP_OUT_DATA(_b_,&nbsp;_d_)&nbsp;*(&nbsp;(volatile&nbsp;unsigned&nbsp;short&nbsp;*)&nbsp;((_b_)))&nbsp;=&nbsp;((unsigned&nbsp;short)&nbsp;(_d_))<br /><br /><br />/*&nbsp;here&nbsp;is&nbsp;all&nbsp;the&nbsp;data&nbsp;*/<br /><br />#define&nbsp;cyg_uint8&nbsp;unsigned&nbsp;char<br />#define&nbsp;cyg_uint16&nbsp;unsigned&nbsp;short<br />#define&nbsp;bool&nbsp;int<br /><br />#define&nbsp;false&nbsp;0<br />#define&nbsp;true&nbsp;1<br /><br />#define&nbsp;CYGHWR_NS_DP83902A_PLF_BROKEN_TX_DMA&nbsp;1<br />#define&nbsp;CYGACC_CALL_IF_DELAY_US(X)&nbsp;my_udelay(X)<br /><br />typedef&nbsp;struct&nbsp;dp83902a_priv_data&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint8*&nbsp;base;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint16*&nbsp;data;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint8*&nbsp;reset;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;tx_next;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;First&nbsp;free&nbsp;Tx&nbsp;page&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;tx_int;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Expecting&nbsp;interrupt&nbsp;from&nbsp;this&nbsp;buffer&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;rx_next;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;First&nbsp;free&nbsp;Rx&nbsp;page&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;tx1,&nbsp;tx2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Page&nbsp;numbers&nbsp;for&nbsp;Tx&nbsp;buffers&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;tx1_key,&nbsp;tx2_key;&nbsp;&nbsp;&nbsp;/*&nbsp;Used&nbsp;to&nbsp;ack&nbsp;when&nbsp;packet&nbsp;sent&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;tx1_len,&nbsp;tx2_len;<br />&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;tx_started,&nbsp;running,&nbsp;hardwired_esa;<br />&nbsp;&nbsp;&nbsp;&nbsp;cyg_uint8&nbsp;esa[6];<br />&nbsp;&nbsp;&nbsp;&nbsp;void*&nbsp;plf_priv;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;Buffer&nbsp;allocation&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;tx_buf1,&nbsp;tx_buf2;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;rx_buf_start,&nbsp;rx_buf_end;<br />}&nbsp;dp83902a_priv_data_t;<br /><br />......<br /><br /><br /><br /><br />--------------------------------------------------------------------------------<br /><br /><br /><br />(3)修改8390.h<br /><br />......<br />/*<br />*&nbsp;&nbsp;&nbsp;&nbsp;Only&nbsp;generate&nbsp;indirect&nbsp;loads&nbsp;given&nbsp;a&nbsp;machine&nbsp;that&nbsp;needs&nbsp;them.<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;removed&nbsp;AMIGA_PCMCIA&nbsp;from&nbsp;this&nbsp;list,&nbsp;handled&nbsp;as&nbsp;ISA&nbsp;io&nbsp;now<br />*/<br /><br />#define&nbsp;n2k_inb(port)&nbsp;&nbsp;&nbsp;(*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(port+CONFIG_DRIVER_NE2000_BASE)))<br />#define&nbsp;n2k_outb(val,port)&nbsp;&nbsp;(*((volatile&nbsp;unsigned&nbsp;char&nbsp;*)(port+CONFIG_DRIVER_NE2000_BASE))&nbsp;=&nbsp;((unsigned&nbsp;char)&nbsp;val))<br /><br />#define&nbsp;EI_SHIFT(x)&nbsp;&nbsp;&nbsp;&nbsp;(x)<br />......&nbsp;<br /><br /><br /><br />--------------------------------------------------------------------------------<br /><br /><br /><br /><br />网卡驱动程序的修改到此结束,以下是总线参数的修改:<br /><br />修改/board/tekkaman/tekkaman2410/lowlevel_init.S文件(参数都是参考&nbsp;刘淼&nbsp;的书):<br /><br />#define&nbsp;B1_BWSCON&nbsp;&nbsp;&nbsp;&nbsp;(DW16)&nbsp;/*@tekkaman*/<br />#define&nbsp;B2_BWSCON&nbsp;&nbsp;&nbsp;&nbsp;(DW16&nbsp;+&nbsp;UBLB)<br />#define&nbsp;B3_BWSCON&nbsp;&nbsp;&nbsp;&nbsp;(DW16)&nbsp;/*@tekkaman*/<br />......<br /><br />#define&nbsp;B2_Tacs&nbsp;&nbsp;&nbsp;&nbsp;0x3&nbsp;/*&nbsp;&nbsp;4clk&nbsp;tekkaman*/<br />#define&nbsp;B2_Tcos&nbsp;&nbsp;&nbsp;&nbsp;0x3&nbsp;/*&nbsp;&nbsp;4clk&nbsp;tekkaman*/<br />#define&nbsp;B2_Tacc&nbsp;&nbsp;&nbsp;&nbsp;0x7&nbsp;/*&nbsp;&nbsp;14clk&nbsp;*/<br />#define&nbsp;B2_Tcoh&nbsp;&nbsp;&nbsp;&nbsp;0x3&nbsp;/*&nbsp;&nbsp;4clk&nbsp;tekkaman*/<br />#define&nbsp;B2_Tah&nbsp;&nbsp;&nbsp;&nbsp;0x3&nbsp;/*&nbsp;&nbsp;4clk&nbsp;tekkaman*/<br />#define&nbsp;B2_Tacp&nbsp;&nbsp;&nbsp;&nbsp;0x3&nbsp;/*&nbsp;&nbsp;6clk&nbsp;tekkaman*/<br />#define&nbsp;B2_PMC&nbsp;&nbsp;&nbsp;&nbsp;0x0&nbsp;/*&nbsp;normal&nbsp;*/<br /><br />......<br /><br /><br /><br />--------------------------------------------------------------------------------<br />在/include/configs/tekkaman2410.h文件中加上AX88796网卡驱动的信息:<br />/*<br />*&nbsp;Hardware&nbsp;drivers<br />*/<br />//#define&nbsp;CONFIG_DRIVER_CS8900&nbsp;1&nbsp;/*&nbsp;we&nbsp;have&nbsp;a&nbsp;CS8900&nbsp;on-board&nbsp;*/<br />//#define&nbsp;CS8900_BASE&nbsp;&nbsp;0x19000300<br />//#define&nbsp;CS8900_BUS16&nbsp;&nbsp;1&nbsp;/*&nbsp;the&nbsp;Linux&nbsp;driver&nbsp;does&nbsp;accesses&nbsp;as&nbsp;shorts&nbsp;*/<br />#define&nbsp;CONFIG_DRIVER_NE2000&nbsp;&nbsp;1<br />#define&nbsp;CONFIG_DRIVER_NE2000_BASE&nbsp;(0x10000000+0x200)<br /><br /><br /><br /><br /><br />--------------------------------------------------------------------------------<br /><br /><br /><br />U-Boot下的AX88796移植结束了,我有复查过,应该在编译网卡驱动的时候连警告都不会有,所以如果您遇到了问题,在检查是否按照上面步骤移植后,还不能解决,可以联系我,QQ:78027228。不过我建议:最好是在看过我介绍的资料后再来移植,出了问题你自己就可以解决了。下一步的目标是U-Boot和Linux下的LCD驱动。以下附上我启动时和运行的输出信息(请注意U-Boot环境变量的设定):<br /><br />U-Boot&nbsp;1.2.0&nbsp;(Sep&nbsp;25&nbsp;2007&nbsp;-&nbsp;14:59:27)<br /><br />U-Boot&nbsp;code:&nbsp;33F80000&nbsp;-&gt&nbsp;33F98BC0&nbsp;&nbsp;BSS:&nbsp;-&gt&nbsp;33F9D3C0<br />DRAM:&nbsp;&nbsp;64&nbsp;MB<br />NAND:&nbsp;&nbsp;&nbsp;&nbsp;64&nbsp;MB<br />In:&nbsp;&nbsp;&nbsp;&nbsp;serial<br />Out:&nbsp;&nbsp;&nbsp;serial<br />Err:&nbsp;&nbsp;&nbsp;serial<br />Hit&nbsp;any&nbsp;key&nbsp;to&nbsp;stop&nbsp;autoboot:&nbsp;&nbsp;0<br />[Tekkaman2410]#&nbsp;printenv<br />bootdelay=3<br />baudrate=115200<br />ethaddr=08:08:08:08:12:27<br />netmask=255.255.255.0<br />bootfile=zImage.img<br />loadaddr=0x30008000<br />bootargs=root=/dev/nfs&nbsp;rw&nbsp;nfsroot=192.168.1.22:/home/tekkaman/working/rootfs&nbsp;ip=192.168.1.2:192.168.1.22::255.255.255.0&nbsp;console=ttySAC0,115200&nbsp;init=/linuxrc&nbsp;mem=64M<br />bootcmd=tftp;bootm<br />ipaddr=192.168.1.2<br />serverip=192.168.1.22<br />stdin=serial<br />stdout=serial<br />stderr=serial<br /><br />Environment&nbsp;size:&nbsp;382/65532&nbsp;bytes<br /><br /><br />U-Boot&nbsp;1.2.0&nbsp;(Sep&nbsp;25&nbsp;2007&nbsp;-&nbsp;14:59:27)<br /><br />U-Boot&nbsp;code:&nbsp;33F80000&nbsp;-&gt&nbsp;33F98BC0&nbsp;&nbsp;BSS:&nbsp;-&gt&nbsp;33F9D3C0<br />DRAM:&nbsp;&nbsp;64&nbsp;MB<br />NAND:&nbsp;&nbsp;&nbsp;&nbsp;64&nbsp;MB<br />In:&nbsp;&nbsp;&nbsp;&nbsp;serial<br />Out:&nbsp;&nbsp;&nbsp;serial<br />Err:&nbsp;&nbsp;&nbsp;serial<br />Hit&nbsp;any&nbsp;key&nbsp;to&nbsp;stop&nbsp;autoboot:&nbsp;&nbsp;0<br />###&nbsp;eth_init<br />matched&nbsp;board&nbsp;31<br />AX88796&nbsp;-&nbsp;tekkmana&nbsp;ESA:&nbsp;08:08:08:08:12:27<br />TFTP&nbsp;from&nbsp;server&nbsp;192.168.1.22;&nbsp;our&nbsp;IP&nbsp;address&nbsp;is&nbsp;192.168.1.2<br />Filename&nbsp;'zImage.img'.<br />Load&nbsp;address:&nbsp;0x30008000<br />Loading:&nbsp;#################################################################<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#################################################################<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#################################################################<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#################################################################<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#################################################################<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#############<br />done<br />Bytes&nbsp;transferred&nbsp;=&nbsp;1727136&nbsp;(1a5aa0&nbsp;hex)<br />##&nbsp;Booting&nbsp;image&nbsp;at&nbsp;30008000&nbsp;...<br />&nbsp;&nbsp;&nbsp;Image&nbsp;Name:&nbsp;&nbsp;&nbsp;tekkamanninja<br />&nbsp;&nbsp;&nbsp;Created:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2007-09-25&nbsp;&nbsp;&nbsp;9:28:11&nbsp;UTC<br />&nbsp;&nbsp;&nbsp;Image&nbsp;Type:&nbsp;&nbsp;&nbsp;ARM&nbsp;Linux&nbsp;Kernel&nbsp;Image&nbsp;(uncompressed)<br />&nbsp;&nbsp;&nbsp;Data&nbsp;Size:&nbsp;&nbsp;&nbsp;&nbsp;1727072&nbsp;Bytes&nbsp;=&nbsp;&nbsp;1.6&nbsp;MB<br />&nbsp;&nbsp;&nbsp;Load&nbsp;Address:&nbsp;30008000<br />&nbsp;&nbsp;&nbsp;Entry&nbsp;Point:&nbsp;&nbsp;30008040<br />&nbsp;&nbsp;&nbsp;Verifying&nbsp;Checksum&nbsp;...&nbsp;OK<br />&nbsp;&nbsp;&nbsp;XIP&nbsp;Kernel&nbsp;Image&nbsp;...&nbsp;OK<br /><br />Starting&nbsp;kernel&nbsp;...<br /><br />Uncompressing&nbsp;Linux................................................................................................................&nbsp;done,&nbsp;booting&nbsp;the&nbsp;kernel.<br />Linux&nbsp;version&nbsp;2.6.22.2&nbsp;(root@Tekkaman-Ninja)&nbsp;(gcc&nbsp;version&nbsp;4.1.0)&nbsp;#5&nbsp;Tue&nbsp;Sep&nbsp;25&nbsp;15:43:11&nbsp;CST&nbsp;2007<br />CPU:&nbsp;ARM920T&nbsp;[41129200]&nbsp;revision&nbsp;0&nbsp;(ARMv4T),&nbsp;cr=c0007177<br />Machine:&nbsp;Tekkaman2410<br />Memory&nbsp;policy:&nbsp;ECC&nbsp;disabled,&nbsp;Data&nbsp;cache&nbsp;writeback<br />CPU&nbsp;S3C2410A&nbsp;(id&nbsp;0x32410002)<br />S3C2410:&nbsp;core&nbsp;202.800&nbsp;MHz,&nbsp;memory&nbsp;101.400&nbsp;MHz,&nbsp;peripheral&nbsp;50.700&nbsp;MHz<br />S3C24XX&nbsp;Clocks,&nbsp;(c)&nbsp;2004&nbsp;Simtec&nbsp;Electronics<br />CLOCK:&nbsp;Slow&nbsp;mode&nbsp;(1.500&nbsp;MHz),&nbsp;fast,&nbsp;MPLL&nbsp;on,&nbsp;UPLL&nbsp;on<br />CPU0:&nbsp;D&nbsp;VIVT&nbsp;write-back&nbsp;cache<br />CPU0:&nbsp;I&nbsp;cache:&nbsp;16384&nbsp;bytes,&nbsp;associativity&nbsp;64,&nbsp;32&nbsp;byte&nbsp;lines,&nbsp;8&nbsp;sets<br />CPU0:&nbsp;D&nbsp;cache:&nbsp;16384&nbsp;bytes,&nbsp;associativity&nbsp;64,&nbsp;32&nbsp;byte&nbsp;lines,&nbsp;8&nbsp;sets<br />Built&nbsp;1&nbsp;zonelists.&nbsp;&nbsp;Total&nbsp;pages:&nbsp;16256<br />Kernel&nbsp;command&nbsp;line:&nbsp;root=/dev/nfs&nbsp;rw&nbsp;nfsroot=192.168.1.22:/home/tekkaman/working/rootfs&nbsp;ip=192.168.1.2:192.168.1.22::255.255.255.0&nbsp;console=ttySAC0,115200&nbsp;init=/linuxrc&nbsp;mem=64M<br />irq:&nbsp;clearing&nbsp;pending&nbsp;ext&nbsp;status&nbsp;00000100<br />irq:&nbsp;clearing&nbsp;subpending&nbsp;status&nbsp;00000002<br />
ddpxy 发表于 2009-4-6 17:13 | 显示全部楼层

比较麻烦的呀

  
linhai1986 发表于 2009-10-29 22:18 | 显示全部楼层
好长的程序啊,看完头就晕了
xiaoxin1986 发表于 2009-10-29 22:30 | 显示全部楼层
学习了
ppyyeepye 发表于 2009-10-29 22:40 | 显示全部楼层
看不懂 看来还要努力啊
ppyyeepye 发表于 2009-10-29 22:41 | 显示全部楼层
看不懂 看来还要努力啊
axwjiang 发表于 2010-7-8 17:59 | 显示全部楼层
建议使用DM9000AEP
zengjiangyi 发表于 2010-8-4 21:28 | 显示全部楼层
我按你的修改了连主机都ping不通
axwjiang 发表于 2010-10-25 18:07 | 显示全部楼层
建议楼上改用DM9000AEP
3B1105 发表于 2010-10-26 22:57 | 显示全部楼层
看不懂,继续努力
bit6019 发表于 2011-1-31 12:49 | 显示全部楼层
看不懂,崇拜楼主
renbaoku 发表于 2011-2-1 09:43 | 显示全部楼层
楼主关于AX88796的问题可以跟我联系
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

185

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

139

主题

185

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部