dm9000.c 3.5 KB

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