dm9000.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include <rtthread.h>
  2. #include "dm9000.h"
  3. #include <netif/ethernetif.h>
  4. #include "lwipopts.h"
  5. #define MAX_ADDR_LEN 6
  6. struct rt_dm9000_eth
  7. {
  8. /* inherit from ethernet device */
  9. struct eth_device parent;
  10. /* interface address info. */
  11. rt_uint8_t dev_addr[MAX_ADDR_LEN]; /* hw address */
  12. };
  13. static struct rt_dm9000_eth dm9000_device;
  14. /* interrupt service routine */
  15. void rt_dm9000_isr(int irqno)
  16. {
  17. rt_uint32_t status;
  18. if (status) // if receive packet
  19. {
  20. rt_err_t result;
  21. /* a frame has been received */
  22. result = eth_device_ready(&(dm9000_device.parent));
  23. RT_ASSERT(result == RT_EOK);
  24. }
  25. if (status) // if finished packet transmission
  26. {
  27. }
  28. }
  29. /* RT-Thread Device Interface */
  30. /* initialize the interface */
  31. static rt_err_t rt_dm9000_init(rt_device_t dev)
  32. {
  33. return RT_EOK;
  34. }
  35. static rt_err_t rt_dm9000_open(rt_device_t dev, rt_uint16_t oflag)
  36. {
  37. return RT_EOK;
  38. }
  39. static rt_err_t rt_dm9000_close(rt_device_t dev)
  40. {
  41. return RT_EOK;
  42. }
  43. static rt_size_t rt_dm9000_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
  44. {
  45. rt_set_errno(-RT_ENOSYS);
  46. return 0;
  47. }
  48. static rt_size_t rt_dm9000_write (rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
  49. {
  50. rt_set_errno(-RT_ENOSYS);
  51. return 0;
  52. }
  53. static rt_err_t rt_dm9000_control(rt_device_t dev, rt_uint8_t cmd, void *args)
  54. {
  55. switch(cmd)
  56. {
  57. case NIOCTL_GADDR:
  58. /* get mac address */
  59. if(args) rt_memcpy(args, dm9000_device.dev_addr, 6);
  60. else return -RT_ERROR;
  61. break;
  62. default :
  63. break;
  64. }
  65. return RT_EOK;
  66. }
  67. /* ethernet device interface */
  68. /* transmit packet. */
  69. rt_err_t rt_dm9000_tx( rt_device_t dev, struct pbuf* p)
  70. {
  71. struct pbuf* q;
  72. rt_uint32_t len;
  73. rt_uint8_t* ptr;
  74. for (q = p; q != NULL; q = q->next)
  75. {
  76. len = q->len;
  77. ptr = q->payload;
  78. /* write data to device */
  79. }
  80. return RT_EOK;
  81. }
  82. /* reception packet. */
  83. struct pbuf *rt_dm9000_rx(rt_device_t dev)
  84. {
  85. struct pbuf* p;
  86. rt_uint32_t len;
  87. /* init p pointer */
  88. p = RT_NULL;
  89. if (1) // if there is packet in device
  90. {
  91. /* get one packet length */
  92. len = 0; // packet length
  93. /* allocate buffer */
  94. p = pbuf_alloc(PBUF_LINK, len, PBUF_RAM);
  95. if (p != RT_NULL)
  96. {
  97. rt_uint8_t* data;
  98. struct pbuf* q;
  99. for (q = p; q != RT_NULL; q= q->next)
  100. {
  101. data = q->payload;
  102. len = q->len;
  103. /* read data from device */
  104. }
  105. }
  106. }
  107. else
  108. {
  109. /* restore interrupt */
  110. }
  111. return p;
  112. }
  113. void rt_hw_dm9000_init()
  114. {
  115. dm9000_device.parent.parent.init = rt_dm9000_init;
  116. dm9000_device.parent.parent.open = rt_dm9000_open;
  117. dm9000_device.parent.parent.close = rt_dm9000_close;
  118. dm9000_device.parent.parent.read = rt_dm9000_read;
  119. dm9000_device.parent.parent.write = rt_dm9000_write;
  120. dm9000_device.parent.parent.control = rt_dm9000_control;
  121. dm9000_device.parent.parent.private = RT_NULL;
  122. dm9000_device.parent.eth_rx = rt_dm9000_rx;
  123. dm9000_device.parent.eth_tx = rt_dm9000_tx;
  124. rt_device_register((rt_device_t)&dm9000_device,
  125. "E0", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_INT_TX);
  126. }