dm9161.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
  1. #include <rtthread.h>
  2. #include <netif/ethernetif.h>
  3. #include "dm9161.h"
  4. #include <sep4020.h>
  5. #include "mii.h"
  6. #define SPEED_10 10
  7. #define SPEED_100 100
  8. #define SPEED_1000 1000
  9. /* Duplex, half or full. */
  10. #define DUPLEX_HALF 0x00
  11. #define DUPLEX_FULL 0x01
  12. /*
  13. * Davicom dm9161EP driver
  14. *
  15. * IRQ_LAN connects to EINT7(GPF7)
  16. * nLAN_CS connects to nGCS4
  17. */
  18. /* #define dm9161_DEBUG 1 */
  19. #if DM9161_DEBUG
  20. #define DM9161_TRACE rt_kprintf
  21. #else
  22. #define DM9161_TRACE(...)
  23. #endif
  24. /*
  25. * dm9161 interrupt line is connected to PF7
  26. */
  27. //--------------------------------------------------------
  28. #define DM9161_PHY 0x40 /* PHY address 0x01 */
  29. #define MAX_ADDR_LEN 6
  30. enum DM9161_PHY_mode
  31. {
  32. DM9161_10MHD = 0, DM9161_100MHD = 1,
  33. DM9161_10MFD = 4, DM9161_100MFD = 5,
  34. DM9161_AUTO = 8, DM9161_1M_HPNA = 0x10
  35. };
  36. enum DM9161_TYPE
  37. {
  38. TYPE_DM9161,
  39. };
  40. struct rt_dm9161_eth
  41. {
  42. /* inherit from ethernet device */
  43. struct eth_device parent;
  44. enum DM9161_TYPE type;
  45. enum DM9161_PHY_mode mode;
  46. rt_uint8_t imr_all;
  47. rt_uint8_t phy_addr;
  48. rt_uint32_t tx_index;
  49. rt_uint8_t packet_cnt; /* packet I or II */
  50. rt_uint16_t queue_packet_len; /* queued packet (packet II) */
  51. /* interface address info. */
  52. rt_uint8_t dev_addr[MAX_ADDR_LEN]; /* hw address */
  53. };
  54. static struct rt_dm9161_eth dm9161_device;
  55. static struct rt_semaphore sem_ack, sem_lock;
  56. void rt_dm9161_isr(int irqno);
  57. static void udelay(unsigned long ns)
  58. {
  59. unsigned long i;
  60. while(ns--)
  61. {
  62. i = 100;
  63. while(i--);
  64. }
  65. }
  66. static __inline unsigned long sep_emac_read(unsigned int reg)
  67. {
  68. void __iomem *emac_base = (void __iomem *)reg;
  69. return read_reg(emac_base);
  70. }
  71. /*
  72. * Write to a EMAC register.
  73. */
  74. static __inline void sep_emac_write(unsigned int reg, unsigned long value)
  75. {
  76. void __iomem *emac_base = (void __iomem *)reg;
  77. write_reg(emac_base,value);
  78. }
  79. /* ........................... PHY INTERFACE ........................... */
  80. /* CAN DO MAC CONFIGRATION
  81. * Enable the MDIO bit in MAC control register
  82. * When not called from an interrupt-handler, access to the PHY must be
  83. * protected by a spinlock.
  84. */
  85. static void enable_mdi(void) //need think more
  86. {
  87. unsigned long ctl;
  88. ctl = sep_emac_read(MAC_CTRL);
  89. sep_emac_write(MAC_CTRL, ctl&(~0x3)); /* enable management port */
  90. return;
  91. }
  92. /* CANNOT DO MAC CONFIGRATION
  93. * Disable the MDIO bit in the MAC control register
  94. */
  95. static void disable_mdi(void)
  96. {
  97. unsigned long ctl;
  98. ctl = sep_emac_read(MAC_CTRL);
  99. sep_emac_write(MAC_CTRL, ctl|(0x3)); /* disable management port */
  100. return;
  101. }
  102. /*
  103. * Wait until the PHY operation is complete.
  104. */
  105. static __inline void sep_phy_wait(void)
  106. {
  107. unsigned long timeout = 2;
  108. while ((sep_emac_read(MAC_MII_STATUS) & 0x2))
  109. {
  110. timeout--;
  111. if (!timeout)
  112. {
  113. EOUT("sep_ether: MDIO timeout\n");
  114. break;
  115. }
  116. }
  117. return;
  118. }
  119. /*
  120. * Write value to the a PHY register
  121. * Note: MDI interface is assumed to already have been enabled.
  122. */
  123. static void write_phy(unsigned char phy_addr, unsigned char address, unsigned int value)
  124. {
  125. unsigned short mii_txdata;
  126. mii_txdata = value;
  127. sep_emac_write(MAC_MII_ADDRESS,(unsigned long)(address<<8) | phy_addr);
  128. sep_emac_write(MAC_MII_TXDATA ,mii_txdata);
  129. sep_emac_write(MAC_MII_CMD ,0x4);
  130. udelay(40);
  131. sep_phy_wait();
  132. return;
  133. }
  134. /*
  135. * Read value stored in a PHY register.
  136. * Note: MDI interface is assumed to already have been enabled.
  137. */
  138. static void read_phy(unsigned char phy_addr, unsigned char address, unsigned int *value)
  139. {
  140. unsigned short mii_rxdata;
  141. // unsigned long mii_status;
  142. sep_emac_write(MAC_MII_ADDRESS,(unsigned long)(address<<8) | phy_addr);
  143. sep_emac_write(MAC_MII_CMD ,0x2);
  144. udelay(40);
  145. sep_phy_wait();
  146. mii_rxdata = sep_emac_read(MAC_MII_RXDATA);
  147. *value = mii_rxdata;
  148. return;
  149. }
  150. /* interrupt service routine */
  151. void rt_dm9161_isr(int irqno)
  152. {
  153. unsigned long intstatus;
  154. rt_uint32_t address;
  155. mask_irq(INTSRC_MAC);
  156. intstatus = sep_emac_read(MAC_INTSRC);
  157. sep_emac_write(MAC_INTSRC,intstatus);
  158. /*Receive complete*/
  159. if(intstatus & 0x04)
  160. {
  161. eth_device_ready(&(dm9161_device.parent));
  162. }
  163. /*Receive error*/
  164. else if(intstatus & 0x08)
  165. {
  166. rt_kprintf("Receive error\n");
  167. }
  168. /*Transmit complete*/
  169. else if(intstatus & 0x03)
  170. {
  171. if(dm9161_device.tx_index == 0)
  172. address = (MAC_TX_BD +(MAX_TX_DESCR-2)*8);
  173. else if(dm9161_device.tx_index == 1)
  174. address = (MAC_TX_BD +(MAX_TX_DESCR-1)*8);
  175. else
  176. address = (MAC_TX_BD + dm9161_device.tx_index*8-16);
  177. //printk("free tx skb 0x%x in inter!!\n",lp->txBuffIndex);
  178. sep_emac_write(address,0x0);
  179. }
  180. else if (intstatus & 0x10)
  181. {
  182. rt_kprintf("ROVER ERROR\n");
  183. }
  184. while(intstatus)
  185. {
  186. sep_emac_write(MAC_INTSRC,intstatus);
  187. intstatus = sep_emac_read(MAC_INTSRC);
  188. }
  189. unmask_irq(INTSRC_MAC);
  190. }
  191. static rt_err_t update_mac_address()
  192. {
  193. rt_uint32_t lo,hi;
  194. hi = sep_emac_read(MAC_ADDR1);
  195. lo = sep_emac_read(MAC_ADDR0);
  196. DBOUT("Before MAC: hi=%x lo=%x\n",hi,lo);
  197. sep_emac_write(MAC_ADDR0,(dm9161_device.dev_addr[2] << 24) | (dm9161_device.dev_addr[3] << 16) | (dm9161_device.dev_addr[4] << 8) | (dm9161_device.dev_addr[5]));
  198. sep_emac_write(MAC_ADDR1,dm9161_device.dev_addr[1]|(dm9161_device.dev_addr[0]<<8));
  199. hi = sep_emac_read(MAC_ADDR1);
  200. lo = sep_emac_read(MAC_ADDR0);
  201. DBOUT("After MAC: hi=%x lo=%x\n",hi,lo);
  202. return RT_EOK;
  203. }
  204. static int mii_link_ok (unsigned long phy_id)
  205. {
  206. /* first, a dummy read, needed to latch some MII phys */
  207. unsigned int value;
  208. read_phy(phy_id, MII_BMSR,&value);
  209. if (value & BMSR_LSTATUS)
  210. return 1;
  211. return 0;
  212. }
  213. static void update_link_speed(unsigned short phy_addr)
  214. {
  215. unsigned int bmsr, bmcr, lpa, mac_cfg;
  216. unsigned int speed, duplex;
  217. if(!mii_link_ok(phy_addr))
  218. {
  219. EOUT("Link Down\n");
  220. //goto result;
  221. }
  222. read_phy(phy_addr,MII_BMSR,&bmsr);
  223. read_phy(phy_addr,MII_BMCR,&bmcr);
  224. if (bmcr & BMCR_ANENABLE) /* AutoNegotiation is enabled */
  225. {
  226. if (!(bmsr & BMSR_ANEGCOMPLETE)) /* Do nothing - another interrupt generated when negotiation complete */
  227. goto result;
  228. read_phy(phy_addr, MII_LPA, &lpa);
  229. if ((lpa & LPA_100FULL) || (lpa & LPA_100HALF))
  230. speed = SPEED_100;
  231. else
  232. speed = SPEED_10;
  233. if ((lpa & LPA_100FULL) || (lpa & LPA_10FULL))
  234. duplex = DUPLEX_FULL;
  235. else
  236. duplex = DUPLEX_HALF;
  237. }
  238. else
  239. {
  240. speed = (bmcr & BMCR_SPEED100) ? SPEED_100 : SPEED_10;
  241. duplex = (bmcr & BMCR_FULLDPLX) ? DUPLEX_FULL : DUPLEX_HALF;
  242. }
  243. /* Update the MAC */
  244. mac_cfg = sep_emac_read(MAC_CTRL);
  245. if (speed == SPEED_100)
  246. {
  247. mac_cfg |= 0x800; /* set speed 100 M */
  248. //bmcr &=(~0x2000);
  249. //write_phy(lp->phy_address, MII_BMCR, bmcr); //将dm9161的速度设为10M
  250. if (duplex == DUPLEX_FULL) /* 100 Full Duplex */
  251. mac_cfg |= 0x400;
  252. else /* 100 Half Duplex */
  253. mac_cfg &= (~0x400);
  254. }
  255. else
  256. {
  257. mac_cfg &= (~0x800); /* set speed 10 M */
  258. if (duplex == DUPLEX_FULL) /* 10 Full Duplex */
  259. mac_cfg |= 0x400;
  260. else /* 10 Half Duplex */
  261. mac_cfg &= (~0x400);
  262. }
  263. sep_emac_write(MAC_CTRL, mac_cfg);
  264. rt_kprintf("Link now %i M-%s\n", speed, (duplex == DUPLEX_FULL) ? "FullDuplex" : "HalfDuplex");
  265. result:
  266. mac_cfg = sep_emac_read(MAC_CTRL);
  267. DBOUT("After mac_cfg=%d\n",mac_cfg);
  268. return;
  269. }
  270. static rt_err_t rt_dm9161_open(rt_device_t dev, rt_uint16_t oflag);
  271. /* RT-Thread Device Interface */
  272. /* initialize the interface */
  273. static rt_err_t rt_dm9161_init(rt_device_t dev)
  274. {
  275. unsigned int phyid1, phyid2;
  276. int detected = -1;
  277. unsigned long phy_id;
  278. unsigned short phy_address = 0;
  279. while ((detected != 0) && (phy_address < 32))
  280. {
  281. /* Read the PHY ID registers */
  282. enable_mdi();
  283. read_phy(phy_address, MII_PHYSID1, &phyid1);
  284. read_phy(phy_address, MII_PHYSID2, &phyid2);
  285. disable_mdi();
  286. phy_id = (phyid1 << 16) | (phyid2 & 0xfff0);
  287. switch (phy_id)
  288. {
  289. case MII_DM9161_ID: /* Davicom 9161: PHY_ID1 = 0x181, PHY_ID2 = B881 */
  290. case MII_DM9161A_ID: /* Davicom 9161A: PHY_ID1 = 0x181, PHY_ID2 = B8A0 */
  291. case MII_RTL8201_ID: /* Realtek RTL8201: PHY_ID1 = 0, PHY_ID2 = 0x8201 */
  292. case MII_BCM5221_ID: /* Broadcom BCM5221: PHY_ID1 = 0x40, PHY_ID2 = 0x61e0 */
  293. case MII_DP83847_ID: /* National Semiconductor DP83847: */
  294. case MII_AC101L_ID: /* Altima AC101L: PHY_ID1 = 0x22, PHY_ID2 = 0x5520 */
  295. case MII_KS8721_ID: /* Micrel KS8721: PHY_ID1 = 0x22, PHY_ID2 = 0x1610 */
  296. {
  297. enable_mdi();
  298. #warning SHOULD SET MAC ADDR
  299. //get_mac_address(dev); /* Get ethernet address and store it in dev->dev_addr */
  300. update_mac_address(); /* Program ethernet address into MAC */
  301. //用哈希寄存器比较当前群播地址,全双工,添加CRC校验,短数据帧进行填充
  302. sep_emac_write(MAC_CTRL, 0xa413);
  303. #warning SHOULD DETERMIN LINK SPEED
  304. update_link_speed(phy_address);
  305. dm9161_device.phy_addr = phy_address;
  306. disable_mdi();
  307. break;
  308. }
  309. }
  310. phy_address++;
  311. }
  312. rt_dm9161_open(dev,0);
  313. return RT_EOK;
  314. }
  315. /* ................................ MAC ................................ */
  316. /*
  317. * Initialize and start the Receiver and Transmit subsystems
  318. */
  319. static void sepether_start()
  320. {
  321. int i;
  322. unsigned int tempaddr;
  323. sep_emac_write(MAC_TXBD_NUM,MAX_TX_DESCR);
  324. //初始化发送和接收描述符
  325. for (i = 0; i < MAX_TX_DESCR; i++)
  326. {
  327. tempaddr=(MAC_TX_BD+i*8);
  328. sep_emac_write(tempaddr,0);
  329. tempaddr=(MAC_TX_BD+i*8+4);
  330. sep_emac_write(tempaddr,0);
  331. }
  332. for (i = 0; i < MAX_RX_DESCR; i++)
  333. {
  334. tempaddr=(MAC_TX_BD + MAX_TX_DESCR*8+i*8);
  335. sep_emac_write(tempaddr,0);
  336. tempaddr=(MAC_TX_BD + MAX_TX_DESCR*8+i*8+4);
  337. sep_emac_write(tempaddr,0);
  338. }
  339. for (i = 0; i < MAX_RX_DESCR; i++)
  340. {
  341. tempaddr=(MAC_TX_BD + MAX_TX_DESCR*8+i*8);
  342. sep_emac_write(tempaddr,0xc000);
  343. tempaddr=(MAC_TX_BD + MAX_TX_DESCR*8+i*8+4);
  344. sep_emac_write(tempaddr,ESRAM_BASE+ MAX_TX_DESCR*0x600+i*0x600);
  345. }
  346. /* Set the Wrap bit on the last descriptor */
  347. tempaddr=(MAC_TX_BD + MAX_TX_DESCR*8+i*8-8);
  348. sep_emac_write(tempaddr,0xe000);
  349. for (i = 0; i < MAX_TX_DESCR; i++)
  350. {
  351. tempaddr=(MAC_TX_BD+i*8);
  352. sep_emac_write(tempaddr,0x0);
  353. tempaddr=(MAC_TX_BD+i*8+4);
  354. sep_emac_write(tempaddr,ESRAM_BASE+i*0x600);
  355. }
  356. return;
  357. }
  358. static rt_err_t rt_dm9161_open(rt_device_t dev, rt_uint16_t oflag)
  359. {
  360. unsigned int dsintr;
  361. enable_mdi();
  362. mask_irq(28);
  363. sep_emac_write(MAC_INTMASK,0x0); //首先屏蔽中断
  364. sepether_start();
  365. /* Enable PHY interrupt */
  366. *(volatile unsigned long*)GPIO_PORTA_DIR |= 0x0080 ; //1 stands for in
  367. *(volatile unsigned long*)GPIO_PORTA_SEL |= 0x0080 ; //for common use
  368. *(volatile unsigned long*)GPIO_PORTA_INCTL |= 0x0080; //中断输入方式
  369. *(volatile unsigned long*)GPIO_PORTA_INTRCTL |= (0x3UL<<14); //中断类型为低电平解发
  370. *(volatile unsigned long*)GPIO_PORTA_INTRCLR |= 0x0080; //清除中断
  371. *(volatile unsigned long*)GPIO_PORTA_INTRCLR = 0x0000; //清除中断
  372. rt_hw_interrupt_install(INTSRC_MAC, rt_dm9161_isr, RT_NULL);
  373. enable_irq(INTSRC_EXINT7);
  374. read_phy(dm9161_device.phy_addr, MII_DSINTR_REG, &dsintr);
  375. dsintr = dsintr & ~0xf00; /* clear bits 8..11 */
  376. write_phy(dm9161_device.phy_addr, MII_DSINTR_REG, dsintr);
  377. update_link_speed(dm9161_device.phy_addr);
  378. /************************************************************************************/
  379. /* Enable MAC interrupts */
  380. sep_emac_write(MAC_INTMASK,0xff); //open中断
  381. sep_emac_write(MAC_INTSRC,0xff); //clear all mac irq
  382. unmask_irq(28);
  383. disable_mdi();
  384. rt_kprintf("SEP4020 ethernet interface open!\n\r");
  385. return RT_EOK;
  386. }
  387. static rt_err_t rt_dm9161_close(rt_device_t dev)
  388. {
  389. rt_kprintf("SEP4020 ethernet interface close!\n\r");
  390. /* Disable Receiver and Transmitter */
  391. disable_mdi();
  392. #warning disable ether;
  393. // INT_ENABLE(28);
  394. /* Disable PHY interrupt */
  395. // disable_phyirq(dev);
  396. /* Disable MAC interrupts */
  397. sep_emac_write(MAC_INTMASK,0); //屏蔽中断
  398. // INT_DISABLE(28);
  399. return RT_EOK;
  400. }
  401. static rt_size_t rt_dm9161_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
  402. {
  403. rt_set_errno(-RT_ENOSYS);
  404. return 0;
  405. }
  406. static rt_size_t rt_dm9161_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
  407. {
  408. rt_set_errno(-RT_ENOSYS);
  409. return 0;
  410. }
  411. static rt_err_t rt_dm9161_control(rt_device_t dev, rt_uint8_t cmd, void *args)
  412. {
  413. return RT_EOK;
  414. }
  415. /* ethernet device interface */
  416. /* transmit packet. */
  417. rt_err_t rt_dm9161_tx( rt_device_t dev, struct pbuf* p)
  418. {
  419. rt_uint8_t i;
  420. rt_uint32_t length = 0;
  421. struct pbuf *q;
  422. unsigned long address;
  423. unsigned long tmp_tx_bd;
  424. /* lock DM9000 device */
  425. // rt_sem_take(&sem_lock, RT_WAITING_FOREVER);
  426. /* disable dm9000a interrupt */
  427. #warning SHOULD DISABLE INTEERUPT?
  428. /*Search for available BD*/
  429. for(i = 0;i<MAX_TX_DESCR;)
  430. {
  431. address = MAC_TX_BD + i*8;
  432. tmp_tx_bd = sep_emac_read(address);
  433. if(!(tmp_tx_bd & 0x8000))
  434. {
  435. if(i == (MAX_TX_DESCR-1))
  436. i = 0;
  437. else
  438. i = i+1;
  439. break;
  440. }
  441. if(i == MAX_TX_DESCR-1)
  442. i = 0;
  443. else
  444. i++;
  445. }
  446. q = p;
  447. while (q)
  448. {
  449. rt_memcpy((u8_t*)(ESRAM_BASE + i*0x600 + length),(u8_t*)q->payload,q->len);
  450. length += q->len;
  451. q = q->next;
  452. }
  453. #warning SHOULD NOTICE IT'S LENGTH
  454. length = length << 16;
  455. if(i == MAX_TX_DESCR - 1)
  456. length |= 0xb800;
  457. else
  458. length |= 0x9800;
  459. address = (MAC_TX_BD + i*8);
  460. dm9161_device.tx_index = i;
  461. sep_emac_write(address,length);
  462. //wait for tranfer complete
  463. while(!(sep_emac_read(address)&0x8000));
  464. /* unlock DM9000 device */
  465. // rt_sem_release(&sem_lock);
  466. /* wait ack */
  467. // rt_sem_take(&sem_ack, RT_WAITING_FOREVER);
  468. return RT_EOK;
  469. }
  470. /* reception packet. */
  471. struct pbuf *rt_dm9161_rx(rt_device_t dev)
  472. {
  473. unsigned int temp_rx_bd,address;
  474. rt_uint32_t i = 0;
  475. rt_uint32_t length;
  476. unsigned char *p_recv;
  477. struct pbuf* p = RT_NULL;
  478. /* lock DM9000 device */
  479. rt_sem_take(&sem_lock, RT_WAITING_FOREVER);
  480. while(1)
  481. {
  482. address = MAC_TX_BD + (MAX_TX_DESCR + i) * 8;
  483. temp_rx_bd = sep_emac_read(address);
  484. if(!(temp_rx_bd & 0x8000))
  485. {
  486. length = temp_rx_bd;
  487. length = length >> 16;
  488. p_recv = (unsigned char*)(ESRAM_BASE + (MAX_TX_DESCR + i) * 0x600);
  489. p = pbuf_alloc(PBUF_LINK,length,PBUF_RAM);
  490. if(p != RT_NULL)
  491. {
  492. struct pbuf* q;
  493. rt_int32_t len;
  494. for(q = p;q != RT_NULL;q = q->next)
  495. {
  496. rt_memcpy((rt_uint8_t*)(q->payload),p_recv,q->len);
  497. }
  498. }
  499. else
  500. {
  501. rt_kprintf("Droping %d packet \n",length);
  502. }
  503. if(i == (MAX_RX_DESCR-1))
  504. {
  505. sep_emac_write(address,0xe000);
  506. i = 0;
  507. }
  508. else
  509. {
  510. sep_emac_write(address,0xc000);
  511. i++;
  512. }
  513. }
  514. else
  515. break;
  516. }
  517. rt_sem_release(&sem_lock);
  518. return p;
  519. }
  520. void rt_hw_dm9161_init()
  521. {
  522. rt_sem_init(&sem_ack, "tx_ack", 1, RT_IPC_FLAG_FIFO);
  523. rt_sem_init(&sem_lock, "eth_lock", 1, RT_IPC_FLAG_FIFO);
  524. dm9161_device.type = TYPE_DM9161;
  525. dm9161_device.mode = DM9161_AUTO;
  526. dm9161_device.packet_cnt = 0;
  527. dm9161_device.queue_packet_len = 0;
  528. /*
  529. * SRAM Tx/Rx pointer automatically return to start address,
  530. * Packet Transmitted, Packet Received
  531. */
  532. #warning NOTICE:
  533. //dm9161_device.imr_all = IMR_PAR | IMR_PTM | IMR_PRM;
  534. dm9161_device.dev_addr[0] = 0x01;
  535. dm9161_device.dev_addr[1] = 0x60;
  536. dm9161_device.dev_addr[2] = 0x6E;
  537. dm9161_device.dev_addr[3] = 0x11;
  538. dm9161_device.dev_addr[4] = 0x02;
  539. dm9161_device.dev_addr[5] = 0x0F;
  540. dm9161_device.parent.parent.init = rt_dm9161_init;
  541. dm9161_device.parent.parent.open = rt_dm9161_open;
  542. dm9161_device.parent.parent.close = rt_dm9161_close;
  543. dm9161_device.parent.parent.read = rt_dm9161_read;
  544. dm9161_device.parent.parent.write = rt_dm9161_write;
  545. dm9161_device.parent.parent.control = rt_dm9161_control;
  546. dm9161_device.parent.parent.user_data = RT_NULL;
  547. dm9161_device.parent.eth_rx = rt_dm9161_rx;
  548. dm9161_device.parent.eth_tx = rt_dm9161_tx;
  549. eth_device_init(&(dm9161_device.parent), "e0");
  550. /* instal interrupt */
  551. #warning TODO
  552. //rt_hw_interrupt_install(INTEINT4_7, rt_dm9161_isr, RT_NULL);
  553. //rt_hw_interrupt_umask(INTEINT4_7);
  554. }
  555. void dm9161a(void)
  556. {
  557. }
  558. #ifdef RT_USING_FINSH
  559. #include <finsh.h>
  560. FINSH_FUNCTION_EXPORT(dm9161a, dm9161a register dump);
  561. #endif