luat_spi_air105.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. #include "luat_base.h"
  2. #include "luat_spi.h"
  3. #include "luat_lcd.h"
  4. #include "app_interface.h"
  5. #define LUAT_LOG_TAG "luat.spi"
  6. #include "luat_log.h"
  7. typedef struct
  8. {
  9. uint8_t id;
  10. uint8_t mark;
  11. uint8_t mode;//spi模式
  12. }Spi_Struct;
  13. static Spi_Struct luat_spi[6] ={0};
  14. int32_t luat_spi_cb(void *pData, void *pParam){
  15. // LLOGD("luat_spi_cb pData:%d pParam:%d ",(int)pData,(int)pParam);
  16. switch ((int)pData){
  17. case 0:
  18. luat_spi[5].mark = 0;
  19. break;
  20. case 1:
  21. luat_spi[0].mark = 0;
  22. break;
  23. case 2:
  24. luat_spi[1].mark = 0;
  25. break;
  26. case 3:
  27. luat_spi[2].mark = 0;
  28. break;
  29. default:
  30. break;
  31. }
  32. }
  33. int luat_spi_device_config(luat_spi_device_t* spi_dev) {
  34. uint8_t spi_mode = SPI_MODE_0;
  35. if(spi_dev->spi_config.CPHA&&spi_dev->spi_config.CPOL)spi_mode = SPI_MODE_3;
  36. else if(spi_dev->spi_config.CPOL)spi_mode = SPI_MODE_1;
  37. else if(spi_dev->spi_config.CPHA)spi_mode = SPI_MODE_2;
  38. SPI_SetNewConfig(luat_spi[spi_dev->bus_id].id, spi_dev->spi_config.bandrate, spi_mode);
  39. return 0;
  40. }
  41. int luat_spi_bus_setup(luat_spi_device_t* spi_dev){
  42. int bus_id = spi_dev->bus_id;
  43. if (bus_id == 0) {
  44. luat_spi[bus_id].id=SPI_ID0;
  45. GPIO_Iomux(GPIOB_12, 0);
  46. GPIO_Iomux(GPIOB_14, 0);
  47. GPIO_Iomux(GPIOB_15, 0);
  48. }
  49. else if (bus_id == 1) {
  50. luat_spi[bus_id].id=SPI_ID1;
  51. GPIO_Iomux(GPIOA_06,3);
  52. GPIO_Iomux(GPIOA_08,3);
  53. GPIO_Iomux(GPIOA_09,3);
  54. }
  55. else if (bus_id == 2) {
  56. luat_spi[bus_id].id=SPI_ID2;
  57. GPIO_Iomux(GPIOB_02,0);
  58. GPIO_Iomux(GPIOB_04,0);
  59. GPIO_Iomux(GPIOB_05,0);
  60. }
  61. else if (bus_id == 5) {
  62. luat_spi[bus_id].id=HSPI_ID0;
  63. GPIO_Iomux(GPIOC_12,3);
  64. GPIO_Iomux(GPIOC_13,3);
  65. GPIO_Iomux(GPIOC_15,3);
  66. }
  67. else {
  68. return -1;
  69. }
  70. uint8_t spi_mode = SPI_MODE_0;
  71. if(spi_dev->spi_config.CPHA&&spi_dev->spi_config.CPOL)spi_mode = SPI_MODE_3;
  72. else if(spi_dev->spi_config.CPOL)spi_mode = SPI_MODE_1;
  73. else if(spi_dev->spi_config.CPHA)spi_mode = SPI_MODE_2;
  74. luat_spi[bus_id].mode=spi_dev->spi_config.mode;
  75. // LLOGD("SPI_MasterInit luat_bus_%d:%d dataw:%d spi_mode:%d bandrate:%d ",bus_id,luat_spi[bus_id].id, spi_dev->spi_config.dataw, spi_mode, spi_dev->spi_config.bandrate);
  76. SPI_MasterInit(luat_spi[bus_id].id, spi_dev->spi_config.dataw, spi_mode, spi_dev->spi_config.bandrate, luat_spi_cb, NULL);
  77. return 0;
  78. }
  79. //初始化配置SPI各项参数,并打开SPI
  80. //成功返回0
  81. int luat_spi_setup(luat_spi_t* spi) {
  82. uint8_t spi_id = spi->id;
  83. if (spi_id == 0) {
  84. luat_spi[spi_id].id=SPI_ID0;
  85. if (spi_id == 0 || spi->cs == GPIOB_13)
  86. GPIO_Iomux(GPIOB_13, 0);
  87. GPIO_Iomux(GPIOB_12, 0);
  88. GPIO_Iomux(GPIOB_14, 0);
  89. GPIO_Iomux(GPIOB_15, 0);
  90. }
  91. else if (spi_id == 1) {
  92. luat_spi[spi_id].id=SPI_ID1;
  93. if (spi_id == 1 || spi->cs == GPIOA_07)
  94. GPIO_Iomux(GPIOA_07,3);
  95. GPIO_Iomux(GPIOA_06,3);
  96. GPIO_Iomux(GPIOA_08,3);
  97. GPIO_Iomux(GPIOA_09,3);
  98. }
  99. else if (spi_id == 2) {
  100. luat_spi[spi_id].id=SPI_ID2;
  101. if (spi_id == 2 || spi->cs == GPIOB_03)
  102. GPIO_Iomux(GPIOB_03,0);
  103. GPIO_Iomux(GPIOB_02,0);
  104. GPIO_Iomux(GPIOB_04,0);
  105. GPIO_Iomux(GPIOB_05,0);
  106. }
  107. else if (spi_id == 5) {
  108. luat_spi[spi_id].id=HSPI_ID0;
  109. if (spi_id == 5 || spi->cs == GPIOC_14)
  110. GPIO_Iomux(GPIOC_14,3);
  111. GPIO_Iomux(GPIOC_12,3);
  112. GPIO_Iomux(GPIOC_13,3);
  113. GPIO_Iomux(GPIOC_15,3);
  114. }
  115. else {
  116. return -1;
  117. }
  118. uint8_t spi_mode = SPI_MODE_0;
  119. if(spi->CPHA&&spi->CPOL)spi_mode = SPI_MODE_3;
  120. else if(spi->CPOL)spi_mode = SPI_MODE_1;
  121. else if(spi->CPHA)spi_mode = SPI_MODE_2;
  122. luat_spi[spi_id].mode=spi->mode;
  123. // LLOGD("SPI_MasterInit luat_spi%d:%d dataw:%d spi_mode:%d bandrate:%d ",spi_id,luat_spi[spi_id], spi->dataw, spi_mode, spi->bandrate);
  124. SPI_MasterInit(luat_spi[spi_id].id, spi->dataw, spi_mode, spi->bandrate, luat_spi_cb, NULL);
  125. return 0;
  126. }
  127. //关闭SPI,成功返回0
  128. int luat_spi_close(int spi_id) {
  129. return 0;
  130. }
  131. //收发SPI数据,返回接收字节数
  132. int luat_spi_transfer(int spi_id, const char* send_buf, size_t send_length, char* recv_buf, size_t recv_length) {
  133. // LLOGD("SPI_MasterInit luat_spi%d:%d send_buf:%x recv_buf:%x length:%d ",spi_id,luat_spi[spi_id], *send_buf, *recv_buf, length);
  134. // while(luat_spi[spi_id].mark)
  135. luat_spi[spi_id].mark = 1;
  136. if(luat_spi[spi_id].mode==1)
  137. SPI_FlashBlockTransfer(luat_spi[spi_id].id, send_buf, send_length, recv_buf, recv_length);
  138. else
  139. SPI_BlockTransfer(luat_spi[spi_id].id, send_buf, recv_buf, recv_length);
  140. return recv_length;
  141. }
  142. //收SPI数据,返回接收字节数
  143. int luat_spi_recv(int spi_id, char* recv_buf, size_t length) {
  144. // LLOGD("SPI_MasterInit luat_spi%d:%d recv_buf:%x length:%d ",spi_id,luat_spi[spi_id], *recv_buf, length);
  145. // while(luat_spi[spi_id].mark)
  146. luat_spi[spi_id].mark = 1;
  147. SPI_BlockTransfer(luat_spi[spi_id].id, recv_buf, recv_buf, length);
  148. return length;
  149. }
  150. //发SPI数据,返回发送字节数
  151. int luat_spi_send(int spi_id, const char* send_buf, size_t length) {
  152. // LLOGD("luat_spi_send luat_spi%d:%d send_buf:%x length:%d ",spi_id,luat_spi[spi_id], *send_buf, length);
  153. // while(luat_spi[spi_id].mark)
  154. luat_spi[spi_id].mark = 1;
  155. SPI_BlockTransfer(luat_spi[spi_id].id, send_buf, NULL, length);
  156. return length;
  157. }
  158. int luat_lcd_draw_no_block(luat_lcd_conf_t* conf, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, luat_color_t* color, uint8_t last_flush)
  159. {
  160. uint32_t retry_cnt = 0;
  161. uint32_t cache_len = Core_LCDDrawCacheLen();
  162. // if (last_flush)
  163. // {
  164. // LLOGD("lcd flush done!");
  165. // }
  166. if (conf->port == LUAT_LCD_SPI_DEVICE){
  167. while (Core_LCDDrawCacheLen() > (conf->buffer_size))
  168. {
  169. retry_cnt++;
  170. luat_timer_mdelay(1);
  171. }
  172. if (retry_cnt)
  173. {
  174. LLOGD("lcd flush delay %ums, status %u,%u,%u,%d", retry_cnt, cache_len, x2-x1+1, y2-y1+1, last_flush);
  175. }
  176. LCD_DrawStruct *draw = OS_Zalloc(sizeof(LCD_DrawStruct));
  177. if (!draw)
  178. {
  179. LLOGE("lcd flush no memory");
  180. return -1;
  181. }
  182. luat_spi_device_t* spi_dev = (luat_spi_device_t*)conf->userdata;
  183. int spi_id = spi_dev->bus_id;
  184. uint8_t spi_mode = SPI_MODE_0;
  185. if(spi_dev->spi_config.CPHA&&spi_dev->spi_config.CPOL)spi_mode = SPI_MODE_3;
  186. else if(spi_dev->spi_config.CPOL)spi_mode = SPI_MODE_1;
  187. else if(spi_dev->spi_config.CPHA)spi_mode = SPI_MODE_2;
  188. draw->DCDelay = conf->dc_delay_us;
  189. draw->Mode = spi_mode;
  190. draw->Speed = spi_dev->spi_config.bandrate;
  191. draw->SpiID = luat_spi[spi_id].id;
  192. draw->CSPin = spi_dev->spi_config.cs;
  193. draw->DCPin = conf->pin_dc;
  194. draw->x1 = x1;
  195. draw->x2 = x2;
  196. draw->y1 = y1;
  197. draw->y2 = y2;
  198. draw->xoffset = conf->xoffset;
  199. draw->yoffset = conf->yoffset;
  200. draw->Size = (draw->x2 - draw->x1 + 1) * (draw->y2 - draw->y1 + 1) * 2;
  201. draw->ColorMode = COLOR_MODE_RGB_565;
  202. draw->Data = OS_Malloc(draw->Size);
  203. if (!draw->Data)
  204. {
  205. LLOGE("lcd flush data no memory");
  206. OS_Free(draw);
  207. return -1;
  208. }
  209. memcpy(draw->Data, color, draw->Size);
  210. Core_LCDDraw(draw);
  211. return 0;
  212. }
  213. else
  214. {
  215. return -1;
  216. }
  217. }