hal_module_adapter.c 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676
  1. #include "bsp.h"
  2. #include "osasys.h"
  3. #include "ostask.h"
  4. #include "queue.h"
  5. #include "debug_log.h"
  6. #include "slpman_ec616.h"
  7. #include "plat_config.h"
  8. #include "hal_uart.h"
  9. #include "hal_adc.h"
  10. #include "adc_ec616.h"
  11. #include "gpio_ec616.h"
  12. #include "hal_module_adapter.h"
  13. /*
  14. gps
  15. */
  16. static posGGACallBack gGPSDataCBfunc =NULL;
  17. // GSENSOR device addr
  18. #define GSENSOR_DEVICE_ADDR (SC7A20_IIC_ADDRESS)
  19. #define ZM01_DEVICE_ADDR (0x2a)
  20. extern QueueHandle_t gpsMsgQueue;
  21. extern bool Sleep_Flag;
  22. /*
  23. i2c
  24. */
  25. #define HAL_I2C_RECV_TASK_QUEUE_CREATED (0x1)
  26. #define I2C_RECV_QUEUE_BUF_SIZE (0x10)
  27. #define I2C_RECV_TASK_STACK_SIZE (1536)
  28. /*
  29. power control
  30. */
  31. #define AON_GPS_POWER2 (4)
  32. #define AON_RELAY_DRV (5)
  33. #define AON_WAKEUP (8)
  34. #define GPIO_MOS_DRV1 (14)
  35. #define GPIO_MOS_DRV2 (15)
  36. #define GPIO_POWER_LED (9)
  37. /*GPS*/
  38. #define FEM_GPS_RSTN (6)
  39. #define FEM_GPS_BLK (7)
  40. #define FEM_GPS_PPS (9)
  41. /*
  42. I2C
  43. */
  44. #define I2C_RECV_CONTROL_FLAG (0x1)
  45. static UINT32 g_halI2CInitFlag = 0;
  46. static osEventFlagsId_t g_i2CRecvFlag;
  47. static StaticQueue_t i2c_recv_queue_cb;
  48. static StaticTask_t i2c_recv_task;
  49. static UINT8 i2c_recv_task_stack[I2C_RECV_TASK_STACK_SIZE];
  50. static UINT8 i2c_recv_queue_buf[I2C_RECV_QUEUE_BUF_SIZE*sizeof(i2c_recv_msgqueue_obj_t)];
  51. // message queue id
  52. static osMessageQueueId_t i2c_recv_msgqueue;
  53. /*
  54. adc
  55. */
  56. #define ADC_TASK_STACK_SIZE (512)
  57. #define ADC_MSG_MAX_NUM (7)
  58. #define ADC_AioResDivRatioDefault (ADC_AioResDivRatio1)
  59. #define REV_AioResDivRatioDefault 1
  60. #define ADC_ChannelAioVbat (1800)
  61. #define ADC_ChannelAioRes (15000)
  62. #define NTC_FullAioValue (1200)
  63. #define ADC_AioResDivRatioExtra (ADC_AioResDivRatio8Over16)
  64. #define REV_AioResDivRatioExtra 16/8
  65. #define NTC_REQ_UPDATE_DATA (0x01)
  66. #define ADC_MSG_TIMEOUT (1000)
  67. #define ADC_RECV_CONTROL_FLAG (0x1)
  68. typedef struct
  69. {
  70. UINT8 flagC4;
  71. UINT32 request;
  72. UINT32 NTCvalue[7];
  73. }NtcResult_t;
  74. NtcResult_t gNtcDev;
  75. volatile static UINT32 vbatChannelResult = 0;
  76. volatile static UINT32 thermalChannelResult = 0;
  77. volatile static UINT32 NTCChannelResult[NTC_ChannelMax];
  78. QueueHandle_t adcMsgHandle = NULL;
  79. static osEventFlagsId_t adcEvtHandle = NULL;
  80. static osEventFlagsId_t adcTrigerHandle = NULL;
  81. static osThreadId_t adcTaskHandle = NULL;
  82. static StaticTask_t adcTask = NULL;
  83. static UINT8 adcTaskStack[ADC_TASK_STACK_SIZE];
  84. /*
  85. gps
  86. */
  87. #define GPS_TASK_STACK_SIZE (2048)
  88. QueueHandle_t gpsMsgHandle = NULL;
  89. static osThreadId_t gpsTaskHandle = NULL;
  90. static StaticTask_t gpsTask = NULL;
  91. static UINT8 gpsTaskStack[GPS_TASK_STACK_SIZE];
  92. /*
  93. can
  94. */
  95. static osMessageQueueId_t can_recv_msgqueue;
  96. static StaticQueue_t can_recv_queue_cb;
  97. #define CAN_RECV_QUEUE_BUF_SIZE (0x10)
  98. static UINT8 can_recv_queue_buf[CAN_RECV_QUEUE_BUF_SIZE];
  99. #define CAN_RECV_CONTROL_FLAG (0x1)
  100. //#define SPI_ANALOG
  101. #ifdef SPI_ANALOG
  102. #define USING_SPI0 0
  103. #endif
  104. /*spi0*/
  105. #ifdef SPI_ANALOG
  106. #if USING_SPI0
  107. #define SPI_SSN_GPIO_INSTANCE RTE_SPI0_SSN_GPIO_INSTANCE
  108. #define SPI_SSN_GPIO_INDEX RTE_SPI0_SSN_GPIO_INDEX
  109. #define SPI_SSN_GPIO_PAD_ADDR 21
  110. #define SPI_CLK_GPIO_INSTANCE 0
  111. #define SPI_CLK_GPIO_INDEX 15
  112. #define SPI_CLK_GPIO_PAD_ADDR 24
  113. #define SPI_MOSI_GPIO_INSTANCE 0
  114. #define SPI_MOSI_GPIO_INDEX 11
  115. #define SPI_MOSI_GPIO_PAD_ADDR 22
  116. #define SPI_MISO_GPIO_INSTANCE 0
  117. #define SPI_MISO_GPIO_INDEX 14
  118. #define SPI_MISO_GPIO_PAD_ADDR 23
  119. #else //SPI1
  120. #define SPI_SSN_GPIO_INSTANCE RTE_SPI1_SSN_GPIO_INSTANCE
  121. #define SPI_SSN_GPIO_INDEX RTE_SPI1_SSN_GPIO_INDEX
  122. #define SPI_SSN_GPIO_PAD_ADDR 13
  123. #define SPI_CLK_GPIO_INSTANCE 0
  124. #define SPI_CLK_GPIO_INDEX 5
  125. #define SPI_CLK_GPIO_PAD_ADDR 16
  126. #define SPI_MOSI_GPIO_INSTANCE 0
  127. #define SPI_MOSI_GPIO_INDEX 3
  128. #define SPI_MOSI_GPIO_PAD_ADDR 14
  129. #define SPI_MISO_GPIO_INSTANCE 0
  130. #define SPI_MISO_GPIO_INDEX 4
  131. #define SPI_MISO_GPIO_PAD_ADDR 15
  132. #endif
  133. #else
  134. #define SPI_SSN_GPIO_INSTANCE RTE_SPI1_SSN_GPIO_INSTANCE
  135. #define SPI_SSN_GPIO_INDEX RTE_SPI1_SSN_GPIO_INDEX
  136. #endif
  137. extern ARM_DRIVER_I2C Driver_I2C0;
  138. extern ARM_DRIVER_SPI Driver_SPI0;
  139. extern ARM_DRIVER_SPI Driver_SPI1;
  140. extern ARM_DRIVER_USART Driver_USART2;
  141. uint8_t gps_uart_recv_buf[GPS_DATA_RECV_BUFFER_SIZE];
  142. static ARM_DRIVER_SPI *spiMasterDrv = &CREATE_SYMBOL(Driver_SPI, 1);
  143. static ARM_DRIVER_I2C *i2cDrvInstance = &CREATE_SYMBOL(Driver_I2C, 0);
  144. static ARM_DRIVER_USART *usartHandle = &CREATE_SYMBOL(Driver_USART, 2);
  145. //LED define pin index
  146. #define LED_INX_MAX (5)
  147. #define LED_PORT_0 (0)
  148. #define LED_PORT_1 (1)
  149. /*
  150. pin1~pin4 for soc display
  151. pin5 for fault display
  152. */
  153. #define LED_GPIO_PIN_1 (6)
  154. #define LED_PAD_INDEX1 (17)
  155. #define LED_GPIO_PIN_2 (7)
  156. #define LED_PAD_INDEX2 (18)
  157. #define LED_GPIO_PIN_3 (0)
  158. #define LED_PAD_INDEX3 (21)
  159. #define LED_GPIO_PIN_4 (11)
  160. #define LED_PAD_INDEX4 (22)
  161. #define LED_GPIO_PIN_5 (1)
  162. #define LED_PAD_INDEX5 (27)
  163. led_pin_config_t gLedCfg[LED_INX_MAX]={{LED_PORT_0,LED_GPIO_PIN_1,LED_PAD_INDEX1, PAD_MuxAlt0},\
  164. {LED_PORT_0,LED_GPIO_PIN_2,LED_PAD_INDEX2, PAD_MuxAlt0},\
  165. {LED_PORT_1,LED_GPIO_PIN_3,LED_PAD_INDEX3, PAD_MuxAlt0},\
  166. {LED_PORT_0,LED_GPIO_PIN_4,LED_PAD_INDEX4, PAD_MuxAlt0},\
  167. {LED_PORT_1,LED_GPIO_PIN_5,LED_PAD_INDEX5, PAD_MuxAlt0}};
  168. #if 0
  169. /**
  170. \fn void NetSocDisplay(UINT8 soc)
  171. \param[in] void
  172. \brief RSSI display on led
  173. \return
  174. */
  175. #define RSSI_LEVEL_0 (0)
  176. #define RSSI_LEVEL_10 (10)
  177. #define RSSI_LEVEL_20 (20)
  178. #define RSSI_LEVEL_25 (25)
  179. #define RSSI_LEVEL_30 (30)
  180. void NetSocDisplay(UINT8 soc)
  181. {
  182. UINT16 pinLevel[LED_INX_MAX-1] ={0};
  183. gpio_pin_config_t nGpioCfg={0};
  184. nGpioCfg.pinDirection = GPIO_DirectionOutput;
  185. nGpioCfg.misc.initOutput = 1;
  186. for(int8_t i=0;i< LED_INX_MAX-1;i++){
  187. GPIO_PinConfig(gLedCfg[i].pinPort, gLedCfg[i].pinInx, &nGpioCfg);
  188. }
  189. if(RSSI_LEVEL_0 < soc && soc <=RSSI_LEVEL_10)
  190. {
  191. pinLevel[0]=1;
  192. pinLevel[1]=pinLevel[2]=pinLevel[3]=0;
  193. }
  194. else if(RSSI_LEVEL_10 < soc && soc <=RSSI_LEVEL_20)
  195. {
  196. pinLevel[0]=pinLevel[1]=1;
  197. pinLevel[2]=pinLevel[3]=0;
  198. }
  199. else if(RSSI_LEVEL_20 < soc && soc <=RSSI_LEVEL_25)
  200. {
  201. pinLevel[0]=pinLevel[1]=pinLevel[2]=1;
  202. pinLevel[3]=0;
  203. }
  204. else if(RSSI_LEVEL_25 < soc && soc <=RSSI_LEVEL_30)
  205. {
  206. pinLevel[0]=pinLevel[1]=pinLevel[2]=pinLevel[3]=1;
  207. }
  208. for(UINT8 i=0; i<LED_INX_MAX-1; i++)
  209. {
  210. GPIO_PinWrite(gLedCfg[i].pinPort, 1<<gLedCfg[i].pinInx, pinLevel[i]<<gLedCfg[i].pinInx);
  211. }
  212. }
  213. #endif
  214. void NetSocDisplay(ledInx_t Inx , ledStaus_t level)
  215. {
  216. UINT16 pinLevel[LED_INX_MAX-1] ={0};
  217. gpio_pin_config_t nGpioCfg={0};
  218. nGpioCfg.pinDirection = GPIO_DirectionOutput;
  219. nGpioCfg.misc.initOutput = 1;
  220. pad_config_t padConfig;
  221. PAD_GetDefaultConfig(&padConfig);
  222. padConfig.mux = gLedCfg[Inx].padMutex;
  223. PAD_SetPinConfig(gLedCfg[Inx].padInx, &padConfig);
  224. PAD_SetPinPullConfig(gLedCfg[Inx].padInx, PAD_InternalPullDown);
  225. GPIO_PinConfig(gLedCfg[Inx].pinPort, gLedCfg[Inx].pinInx, &nGpioCfg);
  226. GPIO_PinWrite(gLedCfg[Inx].pinPort, 1<<gLedCfg[Inx].pinInx, level <<gLedCfg[Inx].pinInx);
  227. }
  228. /**
  229. \fn void FaultDisplay(ledStaus_t status)
  230. \param[in] status equal to 1 ,turn on red led ; status equal to 0 ,turn off red led
  231. \brief RSSI display on led
  232. \return
  233. */
  234. void FaultDisplay(ledStaus_t status)
  235. {
  236. gpio_pin_config_t nGpioCfg={0};
  237. nGpioCfg.pinDirection = GPIO_DirectionOutput;
  238. nGpioCfg.misc.initOutput = 1;
  239. pad_config_t padConfig;
  240. PAD_GetDefaultConfig(&padConfig);
  241. padConfig.mux = gLedCfg[4].padMutex;
  242. PAD_SetPinConfig(gLedCfg[4].padInx, &padConfig);
  243. PAD_SetPinPullConfig(gLedCfg[4].padInx, PAD_InternalPullDown);
  244. GPIO_PinConfig(gLedCfg[4].pinPort, gLedCfg[4].pinInx, &nGpioCfg);
  245. GPIO_PinWrite(gLedCfg[4].pinPort, 1<<gLedCfg[4].pinInx, status<<gLedCfg[4].pinInx);
  246. }
  247. /**
  248. * @brief
  249. * @param
  250. * @return
  251. */
  252. void SPI_CS_High(void)
  253. {
  254. GPIO_PinWrite(SPI_SSN_GPIO_INSTANCE, 1 << SPI_SSN_GPIO_INDEX, 1 << SPI_SSN_GPIO_INDEX);
  255. }
  256. /**
  257. * @brief
  258. * @param
  259. * @return
  260. */
  261. void SPI_CS_Low(void)
  262. {
  263. GPIO_PinWrite(SPI_SSN_GPIO_INSTANCE, 1 << SPI_SSN_GPIO_INDEX, 0);
  264. }
  265. #ifdef SPI_ANALOG
  266. /**
  267. * @brief
  268. * @param
  269. * @return
  270. */
  271. void SPI_Clk_High(void)
  272. {
  273. GPIO_PinWrite(SPI_CLK_GPIO_INSTANCE, 1<<SPI_CLK_GPIO_INDEX,1<<SPI_CLK_GPIO_INDEX);
  274. }
  275. /**
  276. * @brief
  277. * @param
  278. * @return
  279. */
  280. void SPI_Clk_Low(void)
  281. {
  282. GPIO_PinWrite(SPI_CLK_GPIO_INSTANCE, 1<<SPI_CLK_GPIO_INDEX,0);
  283. }
  284. /**
  285. * @brief
  286. * @param
  287. * @return
  288. */
  289. void SPI_Mosi_High(void)
  290. {
  291. GPIO_PinWrite(SPI_MOSI_GPIO_INSTANCE, 1<<SPI_MOSI_GPIO_INDEX,1<<SPI_MOSI_GPIO_INDEX);
  292. }
  293. /**
  294. * @brief
  295. * @param
  296. * @return
  297. */
  298. void SPI_Mosi_Low(void)
  299. {
  300. GPIO_PinWrite(SPI_MOSI_GPIO_INSTANCE, 1<<SPI_MOSI_GPIO_INDEX,0);
  301. }
  302. /**
  303. * @brief
  304. * @param
  305. * @return
  306. */
  307. UINT8 SPI_MISO_Read(void)
  308. {
  309. return GPIO_PinRead(SPI_MISO_GPIO_INSTANCE,SPI_MISO_GPIO_INDEX);
  310. }
  311. #endif
  312. /**
  313. * @brief Software SPI_Flash bus driver basic function, send a single byte to MOSI,
  314. * and accept MISO data at the same time.
  315. * @param[in] u8Data:Data sent on the MOSI data line
  316. * @return u8Out: Data received on the MISO data line
  317. */
  318. UINT8 SPI_Write_Byte(UINT8 u8Data)
  319. {
  320. UINT8 data = u8Data;
  321. #ifdef SPI_ANALOG
  322. UINT8 i=0;
  323. for(i=0;i<8;i++){
  324. SPI_Clk_Low();
  325. if((u8Data<<i)&0x80)
  326. SPI_Mosi_High();
  327. else
  328. SPI_Mosi_Low();
  329. SPI_Clk_High();
  330. }
  331. SPI_Clk_Low();
  332. #else
  333. spiMasterDrv->Transfer(&u8Data,&data,1);
  334. #endif
  335. return 0;
  336. }
  337. #ifdef SPI_ANALOG
  338. /**
  339. * @brief
  340. * @param
  341. * @return
  342. */
  343. UINT8 SPI_Read_Byte(void)
  344. {
  345. UINT8 i=0;
  346. UINT8 rByte=0;
  347. SPI_Clk_Low();
  348. for(i=0;i<8;i++){
  349. SPI_Clk_High();
  350. rByte<<=1;
  351. rByte |= SPI_MISO_Read();
  352. SPI_Clk_Low();
  353. }
  354. return rByte;
  355. }
  356. #endif
  357. /**
  358. \fn INT32 CAN_ReadReg(UINT8 addr)
  359. \param[in] addr CAN register addr
  360. \brief write can register
  361. \return
  362. */
  363. INT32 CAN_WriteReg(UINT8 addr, UINT8 value)
  364. {
  365. SPI_CS_Low();
  366. SPI_Write_Byte(CAN_WRITE);
  367. SPI_Write_Byte(addr);
  368. SPI_Write_Byte(value);
  369. SPI_CS_High();
  370. return 0;
  371. }
  372. /**
  373. \fn INT32 CAN_ReadReg(UINT8 reg, UINT8 len, UINT8 *buf)
  374. \param[in] reg: can register addr
  375. \brief read can register
  376. \return
  377. */
  378. INT32 CAN_ReadReg(UINT8 reg, UINT8 len, UINT8 *buf)
  379. {
  380. UINT8 i =0;
  381. UINT8 data=0;
  382. INT32 res;
  383. if(buf == NULL) return -1;
  384. SPI_CS_Low();
  385. SPI_Write_Byte(CAN_READ);
  386. SPI_Write_Byte(reg);
  387. #ifdef SPI_ANALOG
  388. for(i=0;i<len;i++){
  389. buf[i]= SPI_Read_Byte();
  390. }
  391. #else
  392. for(i=0;i<len;i++){
  393. spiMasterDrv->Transfer(&data,&buf[i],1);
  394. }
  395. #endif
  396. SPI_CS_High();
  397. return i;
  398. }
  399. /**
  400. \fn UINT8 CanTriggerEvtInit(void)
  401. \param[in]
  402. \brief generate irq,then notify app
  403. \return 1 fail; 0 ok;
  404. */
  405. UINT8 CanTriggerEvtInit(void)
  406. {
  407. /*for msg queue create*/
  408. osMessageQueueAttr_t queue_attr;
  409. memset(&queue_attr, 0, sizeof(queue_attr));
  410. queue_attr.cb_mem = &can_recv_queue_cb;
  411. queue_attr.cb_size = sizeof(can_recv_queue_cb);
  412. queue_attr.mq_mem = can_recv_queue_buf;
  413. queue_attr.mq_size = sizeof(can_recv_queue_buf);
  414. can_recv_msgqueue = osMessageQueueNew(I2C_RECV_QUEUE_BUF_SIZE,1, &queue_attr);
  415. printf("CanTriggerEvtInit \r\n");
  416. return 0;
  417. }
  418. /**
  419. \fn void CanWaitEvt(UINT32 timeout)
  420. \param[in]
  421. \brief
  422. \return
  423. */
  424. void CanWaitEvt(UINT32 timeout)
  425. {
  426. osStatus_t status;
  427. UINT8 msg = 0;
  428. UINT32 mask;
  429. status = osMessageQueueGet(can_recv_msgqueue, &msg, 0 , osWaitForever);
  430. printf("msg = %#x\r\n",msg);
  431. }
  432. /**
  433. \fn void CanTiggerEvt(UINT8 cmd)
  434. \param[in]
  435. \brief
  436. \return
  437. */
  438. void CanTiggerEvt(UINT8 cmd)
  439. {
  440. osStatus_t status;
  441. UINT8 msg = cmd;
  442. status = osMessageQueuePut(can_recv_msgqueue, &msg, 0, 0);
  443. }
  444. /*******************************************************************************
  445. * o����y?? : MCP2515_Reset
  446. * ?����? : ����?��?��????��?����?t?��??MCP2515
  447. * ��?��? : ?T
  448. * ��?3? : ?T
  449. * ����???�� : ?T
  450. * ?��?�� : ???��2???��??��?��???a������?���䨬?,2��???��?t����?��?a?????�꨺?
  451. *******************************************************************************/
  452. INT32 HAL_Can_Reset(void)
  453. {
  454. SPI_CS_Low();
  455. SPI_Write_Byte(CAN_RESET);
  456. SPI_CS_High();
  457. return 0;
  458. }
  459. /*******************************************************************************
  460. * o����y?? : MCP2515_Init
  461. * ?����? : MCP25153?��??��????
  462. * ��?��? : ?T
  463. * ��?3? : ?T
  464. * ����???�� : ?T
  465. * ?��?�� : 3?��??���㨹������o����?t?��???��1�����2����??������???�������?��??��1?????�̨�?��
  466. *******************************************************************************/
  467. void HAL_Can_Init(Can_InitType param)
  468. {
  469. UINT8 temp=0,temp1=0;
  470. INT32 res = -1;
  471. HAL_Can_Reset(); //����?��?��????��?����?t?��??MCP2515
  472. osDelay(100/portTICK_PERIOD_MS);
  473. CAN_WriteReg(CANCTRL,OPMODE_CONFIG |CLKOUT_ENABLED);
  474. CAN_ReadReg(CANCTRL,1,&temp);//?����?CAN���䨬???��??�¦�??��
  475. // #ifdef USING_PRINTF
  476. // printf("[%d] CANCTRL = %#x \r\n",__LINE__,temp);
  477. // #endif
  478. CAN_WriteReg(CNF1,param.baudrate);
  479. CAN_WriteReg(CNF2,0x80|PHSEG1_3TQ|PRSEG_1TQ);
  480. CAN_WriteReg(CNF3,PHSEG2_3TQ);
  481. if(param.packType == STD_PACK){
  482. /*?����???2��??��??��*/
  483. CAN_WriteReg(TXB0SIDH,0xFF&(param.TxStdIDH));//����?��?o3??��0������?������?��?????
  484. CAN_WriteReg(TXB0SIDL,0xE0&(param.TxStdIDL));//����?��?o3??��0������?������?��?�̨�??
  485. CAN_WriteReg(RXM0SIDH,0xFF);
  486. CAN_WriteReg(RXM0SIDL,0xE0);
  487. CAN_WriteReg(RXM1SIDH,0xFF);
  488. CAN_WriteReg(RXM1SIDL,0xE0);
  489. /*?����???2��??��??��*/
  490. CAN_WriteReg(RXF0SIDH,0xFF&(param.RxStdIDH[0]));
  491. CAN_WriteReg(RXF0SIDL,0xE0&(param.RxStdIDL[0]));
  492. CAN_WriteReg(RXF1SIDH,0xFF&(param.RxStdIDH[1]));
  493. CAN_WriteReg(RXF1SIDL,0xE0&(param.RxStdIDL[1]));
  494. #if 0
  495. CAN_WriteReg(RXF2SIDH,0x00);
  496. CAN_WriteReg(RXF2SIDL,0xa0);
  497. CAN_WriteReg(RXF3SIDH,0x00);
  498. CAN_WriteReg(RXF3SIDL,0x40);
  499. CAN_WriteReg(RXF4SIDH,0x00);
  500. CAN_WriteReg(RXF4SIDL,0x60);
  501. CAN_WriteReg(RXF5SIDH,0x00);
  502. CAN_WriteReg(RXF5SIDL,0x80);
  503. #else
  504. CAN_WriteReg(RXF2SIDH,0xFF&(param.RxStdIDH[2]));
  505. CAN_WriteReg(RXF2SIDL,0xE0&(param.RxStdIDL[2]));
  506. CAN_WriteReg(RXF3SIDH,0xFF&(param.RxStdIDH[3]));
  507. CAN_WriteReg(RXF3SIDL,0xE0&(param.RxStdIDL[3]));
  508. CAN_WriteReg(RXF4SIDH,0xFF&(param.RxStdIDH[4]));
  509. CAN_WriteReg(RXF4SIDL,0xE0&(param.RxStdIDL[4]));
  510. CAN_WriteReg(RXF5SIDH,0xFF&(param.RxStdIDH[5]));
  511. CAN_WriteReg(RXF5SIDL,0xE0&(param.RxStdIDL[5]));
  512. #endif
  513. CAN_WriteReg(RXB0CTRL,RXM_VALID_STD);
  514. CAN_WriteReg(RXB0DLC,DLC_8);
  515. CAN_WriteReg(RXB1CTRL,RXM_VALID_STD|FILHIT1_FLTR_2);
  516. CAN_WriteReg(RXB1DLC,DLC_8);
  517. }
  518. else if(param.packType == EXT_PACK)
  519. {
  520. /*TXB0*/
  521. CAN_WriteReg(TXB0SIDH,0xFF&(param.TxStdIDH));
  522. CAN_WriteReg(TXB0SIDL,(0xEB&(param.TxStdIDL))|0x08);
  523. CAN_WriteReg(TXB0EID8,0xFF&(param.TxExtIDH));
  524. CAN_WriteReg(TXB0EID0,0xFF&(param.TxExtIDL));
  525. /*?����???2��??��??��*/
  526. CAN_WriteReg(RXM0SIDH,0xFF);
  527. CAN_WriteReg(RXM0SIDL,0xE3);
  528. CAN_WriteReg(RXM0EID8,0xFF);
  529. CAN_WriteReg(RXM0EID0,0xFF);
  530. /*?����???2��??��??��*/
  531. CAN_WriteReg(RXF0SIDH,0xFF&(param.RxStdIDH[0]));
  532. CAN_WriteReg(RXF0SIDL,(0xEB&(param.RxStdIDL[0]))|0x08);
  533. CAN_WriteReg(RXF0EID8,0xFF&(param.RxExtIDH[0]));
  534. CAN_WriteReg(RXF0EID8,0xFF&(param.RxExtIDL[0]));
  535. CAN_WriteReg(RXF1SIDH,0xFF&(param.RxStdIDH[1]));
  536. CAN_WriteReg(RXF1SIDL,(0xEB&(param.RxStdIDL[1]))|0x08);
  537. CAN_WriteReg(RXF1EID8,0xFF&(param.RxExtIDH[1]));
  538. CAN_WriteReg(RXF1EID8,0xFF&(param.RxExtIDL[1]));
  539. CAN_WriteReg(RXF2SIDH,0xFF&(param.RxStdIDH[2]));
  540. CAN_WriteReg(RXF2SIDL,(0xEB&(param.RxStdIDL[2]))|0x08);
  541. CAN_WriteReg(RXF2EID8,0xFF&(param.RxExtIDH[2]));
  542. CAN_WriteReg(RXF2EID8,0xFF&(param.RxExtIDL[2]));
  543. CAN_WriteReg(RXF3SIDH,0xFF&(param.RxStdIDH[3]));
  544. CAN_WriteReg(RXF3SIDL,(0xEB&(param.RxStdIDL[3]))|0x08);
  545. CAN_WriteReg(RXF3EID8,0xFF&(param.RxExtIDH[3]));
  546. CAN_WriteReg(RXF3EID8,0xFF&(param.RxExtIDL[3]));
  547. CAN_WriteReg(RXF4SIDH,0xFF&(param.RxStdIDH[4]));
  548. CAN_WriteReg(RXF4SIDL,(0xEB&(param.RxStdIDL[4]))|0x08);
  549. CAN_WriteReg(RXF4EID8,0xFF&(param.RxExtIDH[4]));
  550. CAN_WriteReg(RXF4EID8,0xFF&(param.RxExtIDL[4]));
  551. CAN_WriteReg(RXF5SIDH,0xFF&(param.RxStdIDH[5]));
  552. CAN_WriteReg(RXF5SIDL,(0xEB&(param.RxStdIDL[5]))|0x08);
  553. CAN_WriteReg(RXF5EID8,0xFF&(param.RxExtIDH[5]));
  554. CAN_WriteReg(RXF5EID8,0xFF&(param.RxExtIDL[5]));
  555. CAN_WriteReg(RXB0CTRL,RXM_VALID_EXT);
  556. CAN_WriteReg(RXB0DLC,DLC_8);
  557. CAN_WriteReg(RXB1CTRL,RXM_VALID_EXT|FILHIT1_FLTR_2);
  558. CAN_WriteReg(RXB1DLC,DLC_8);
  559. }
  560. CAN_WriteReg(CANINTE,0x43);
  561. CAN_WriteReg(CANINTF,0x00);
  562. CAN_WriteReg(CANCTRL,param.mode |CLKOUT_ENABLED);//??MCP2515����???a?y3��?�꨺?,��?3??????�꨺? REQOP_NORMAL|CLKOUT_ENABLED
  563. CAN_ReadReg(CANSTAT,1,&temp);//?����?CAN���䨬???��??�¦�??��
  564. if(OPMODE_NORMAL !=(temp&0xE0))//?D??MCP2515��?��?��??-??��??y3��?�꨺?
  565. {
  566. CAN_WriteReg(CANCTRL,param.mode|CLKOUT_ENABLED);//?����???MCP2515����???a?y3��?�꨺?,��?3??????�꨺?REQOP_NORMAL
  567. }
  568. }
  569. /*******************************************************************************
  570. * o����y?? : HAL_Can_Transmit
  571. * ?����? : CAN����?��???��3��?����?��y?Y
  572. * ��?��? : *CAN_TX_Buf(��y����?����y?Y?o3???????),len(��y����?����y?Y3��?��)
  573. * ��?3? : ?T
  574. * ����???�� : ?T
  575. * ?��?�� : ?T
  576. *******************************************************************************/
  577. INT32 HAL_Can_Transmit(Can_TxMsgType Can_TxMsg)
  578. {
  579. UINT8 tryTim,count,value,i;
  580. count=0;
  581. while(count<Can_TxMsg.DLC)
  582. {
  583. tryTim=0;
  584. CAN_ReadReg(TXB0CTRL,1,&value);
  585. while((value&0x08) && (tryTim<50))//?��?��?��?3D?���䨬???��?,�̨���yTXREQ����????��?
  586. {
  587. CAN_ReadReg(TXB0CTRL,1,&value);
  588. osDelay(1/portTICK_PERIOD_MS);
  589. tryTim++;
  590. }
  591. /*TXB0*/
  592. CAN_WriteReg(TXB0SIDH,0xFF&(Can_TxMsg.stdIDH));//����?��?o3??��0������?������?��?????
  593. CAN_WriteReg(TXB0SIDL,0xE0&(Can_TxMsg.stdIDL));//����?��?o3??��0������?������?��?�̨�??
  594. for(i=0;i<8;)
  595. {
  596. CAN_WriteReg(TXB0D0+i,Can_TxMsg.Data[count++]);//??��y����?����?��y?YD�䨨?����?��?o3???��??��
  597. i++;
  598. if(count>=Can_TxMsg.DLC) break;
  599. }
  600. CAN_WriteReg(TXB0DLC,i);//??��???��y����?����?��y?Y3��?��D�䨨?����?��?o3??��0��?����?��3��?��??��??��
  601. SPI_CS_Low();
  602. CAN_WriteReg(TXB0CTRL,0x08);//???������?������??
  603. SPI_CS_High();
  604. }
  605. }
  606. /*******************************************************************************
  607. * o����y?? : HAL_Can_Receive(UINT8 *CAN_RX_Buf)
  608. * ?����? : CAN?����?��???��y?Y
  609. * ��?��? : *CAN_TX_Buf(��y?����?��y?Y?o3???????)
  610. * ��?3? : ?T
  611. * ����???�� : len(?����?��?��y?Y��?3��?��,0~8��??��)
  612. * ?��?�� : ?T
  613. *******************************************************************************/
  614. UINT8 HAL_Can_Receive(UINT8 *CAN_RX_Buf)
  615. {
  616. UINT8 i=0,len=0,temp=0;
  617. CAN_ReadReg(CANINTF,1,&temp);
  618. if(temp & 0x01)
  619. {
  620. CAN_ReadReg(RXB0DLC,1,&len);
  621. while(i<len)
  622. {
  623. CAN_ReadReg(RXB0D0+i,1,&CAN_RX_Buf[i]);
  624. i++;
  625. }
  626. }else if(temp & 0x02){
  627. CAN_ReadReg(RXB1DLC,1,&len);
  628. while(i<len)
  629. {
  630. CAN_ReadReg(RXB1D0+i,1,&CAN_RX_Buf[i]);
  631. i++;
  632. }
  633. }
  634. CAN_WriteReg(CANINTF,0);
  635. return len;
  636. }
  637. /**
  638. \fn void CanHandleDataCallback(UINT32 event)
  639. \param[in] event spi irq event
  640. \brief base on event,handle different situation
  641. \return
  642. */
  643. void CanHandleDataCallback(UINT32 event)
  644. {
  645. if(event & ARM_SPI_EVENT_TRANSFER_COMPLETE)
  646. {
  647. }
  648. else if(event & ARM_SPI_EVENT_DATA_LOST)
  649. {
  650. }
  651. else if(event & ARM_SPI_EVENT_MODE_FAULT)
  652. {
  653. }
  654. #if 0
  655. #ifdef USING_PRINTF
  656. printf("[%d] CanHandleDataCallback :%d\r\n",__LINE__,event);
  657. #else
  658. ECOMM_TRACE(UNILOG_PLA_APP,CAN_CB1, P_INFO, 1, "SPI event [%u] coming!",event);
  659. #endif
  660. #endif
  661. }
  662. /**
  663. \fn void CanSPIHandler(ARM_SPI_SignalEvent_t cb_event)
  664. \param[in] cb_event :
  665. \brief init spi module
  666. \return
  667. */
  668. void CanSPIHandler(ARM_SPI_SignalEvent_t cb_event,UINT8 mode,UINT8 dataBits, UINT32 spiRate )
  669. {
  670. #ifdef SPI_ANALOG
  671. gpio_pin_config_t nGpioCfg={0};
  672. nGpioCfg.pinDirection = GPIO_DirectionOutput;
  673. nGpioCfg.misc.initOutput = 1;
  674. pad_config_t padConfig;
  675. PAD_GetDefaultConfig(&padConfig);
  676. /*cs*/
  677. padConfig.mux = PAD_MuxAlt0;
  678. PAD_SetPinConfig(SPI_SSN_GPIO_PAD_ADDR, &padConfig);
  679. PAD_SetPinPullConfig(SPI_SSN_GPIO_PAD_ADDR, PAD_InternalPullDown);
  680. GPIO_PinConfig(SPI_SSN_GPIO_INSTANCE, SPI_SSN_GPIO_INDEX, &nGpioCfg);
  681. GPIO_PinWrite(SPI_SSN_GPIO_INSTANCE, 1<<SPI_SSN_GPIO_INDEX,0);
  682. /*
  683. clk
  684. */
  685. padConfig.mux = PAD_MuxAlt0;
  686. PAD_SetPinConfig(SPI_CLK_GPIO_PAD_ADDR, &padConfig);
  687. PAD_SetPinPullConfig(SPI_CLK_GPIO_PAD_ADDR, PAD_InternalPullDown);
  688. GPIO_PinConfig(SPI_CLK_GPIO_INSTANCE, SPI_CLK_GPIO_INDEX, &nGpioCfg);
  689. GPIO_PinWrite(SPI_CLK_GPIO_INSTANCE, 1<<SPI_CLK_GPIO_INDEX,0);
  690. /*mosi*/
  691. padConfig.mux = PAD_MuxAlt0;
  692. PAD_SetPinConfig(SPI_MOSI_GPIO_PAD_ADDR, &padConfig);
  693. PAD_SetPinPullConfig(SPI_MOSI_GPIO_PAD_ADDR, PAD_InternalPullDown);
  694. GPIO_PinConfig(SPI_MOSI_GPIO_INSTANCE, SPI_MOSI_GPIO_INDEX, &nGpioCfg);
  695. GPIO_PinWrite(SPI_MOSI_GPIO_INSTANCE, 1<<SPI_MOSI_GPIO_INDEX,0);
  696. /*miso*/
  697. nGpioCfg.pinDirection = GPIO_DirectionInput;
  698. nGpioCfg.misc.initOutput = 0;
  699. padConfig.mux = PAD_MuxAlt0;
  700. padConfig.pullSelect = PAD_PullInternal;
  701. padConfig.pullUpEnable = PAD_PullUpDisable;
  702. padConfig.pullDownEnable = PAD_PullDownEnable;
  703. PAD_SetPinConfig(SPI_MISO_GPIO_PAD_ADDR, &padConfig);
  704. GPIO_PinConfig(SPI_MISO_GPIO_INSTANCE, SPI_MISO_GPIO_INDEX, &nGpioCfg);
  705. #else
  706. // Initialize master spi
  707. spiMasterDrv->Initialize(NULL);
  708. // Power on
  709. spiMasterDrv->PowerControl(ARM_POWER_FULL);
  710. // Configure slave spi bus
  711. spiMasterDrv->Control(ARM_SPI_MODE_MASTER | mode | ARM_SPI_DATA_BITS(dataBits) |ARM_SPI_MSB_LSB | ARM_SPI_SS_MASTER_SW, spiRate);
  712. #endif
  713. }
  714. /**
  715. \fn INT32 ZM01RecvParam(UINT8 *param)
  716. \param[in]
  717. \brief read ZM01 register
  718. \return execution_status
  719. */
  720. INT32 ZM01RecvParam(UINT8 *param)
  721. {
  722. INT32 res = 0;
  723. UINT8 tempBuffer = 0xaa;
  724. if(param == NULL) return -7;
  725. res = i2cDrvInstance->MasterTransmit(ZM01_DEVICE_ADDR, &tempBuffer, 1, true);
  726. res = i2cDrvInstance->MasterReceive(ZM01_DEVICE_ADDR, param, 1, true);
  727. return res;
  728. }
  729. /**
  730. \fn INT32 GSENSOR_WriteReg(UINT8 addr, UINT8 value)
  731. \param[in] addr GSENSOR register addr
  732. \brief Write to GSENSOR register
  733. \return
  734. */
  735. INT32 GSENSOR_WriteReg(UINT8 addr, UINT8 value)
  736. {
  737. UINT8 tempBuffer[2];
  738. INT32 res = -1;
  739. tempBuffer[0] = addr;
  740. tempBuffer[1] = value;
  741. return (i2cDrvInstance->MasterTransmit(GSENSOR_DEVICE_ADDR, tempBuffer, sizeof(tempBuffer), true));
  742. }
  743. /**
  744. \fn INT32 GSENSOR_ReadReg(UINT8 reg, UINT8 len, UINT8 *buf)
  745. \param[in] addr GSENSOR register addr
  746. \brief read GSENSOR register
  747. \return register value of GSENSOR
  748. */
  749. INT32 GSENSOR_ReadReg(UINT8 reg, UINT8 len, UINT8 *buf)
  750. {
  751. INT32 res = -1;
  752. if(len > 8 || buf == NULL) return -1;
  753. res = i2cDrvInstance->MasterTransmit(GSENSOR_DEVICE_ADDR, &reg, 1, true);
  754. res = i2cDrvInstance->MasterReceive(GSENSOR_DEVICE_ADDR, buf, len, true);
  755. return res;
  756. }
  757. /**
  758. \fn void GsensorI2CCallback(UINT32 event)
  759. \param[in] event : i2c irq event
  760. \brief i2c irq event ,callback function
  761. \return
  762. */
  763. void GsensorI2CCallback(UINT32 event)
  764. {
  765. switch(event)
  766. {
  767. case ARM_I2C_EVENT_TRANSFER_DONE:
  768. break;
  769. case ARM_I2C_EVENT_TRANSFER_INCOMPLETE:
  770. break;
  771. case ARM_I2C_EVENT_ADDRESS_NACK:
  772. break;
  773. case ARM_I2C_EVENT_BUS_ERROR:
  774. break;
  775. case ARM_I2C_EVENT_BUS_CLEAR:
  776. break;
  777. default:
  778. break;
  779. }
  780. }
  781. /**
  782. \fn void HAL_I2C_CreateRecvTaskAndQueue(uint32_t event)
  783. \param[in]
  784. \brief RECV data
  785. \return
  786. */
  787. void HAL_I2C_RecvControl(bool on)
  788. {
  789. EC_ASSERT(g_i2CRecvFlag, g_i2CRecvFlag, 0, 0);
  790. if(on == true)
  791. {
  792. osEventFlagsClear(g_i2CRecvFlag, I2C_RECV_CONTROL_FLAG);
  793. }
  794. else
  795. {
  796. osEventFlagsSet(g_i2CRecvFlag, I2C_RECV_CONTROL_FLAG);
  797. }
  798. }
  799. void GsensorTriggerEvent(UINT32 event ,UINT32 data)
  800. {
  801. osStatus_t status;
  802. i2c_recv_msgqueue_obj_t msg={0};
  803. msg.event = event;
  804. msg.value = data;
  805. status = osMessageQueuePut(i2c_recv_msgqueue, &msg, 0, 0);
  806. if(status == osErrorResource)
  807. {
  808. //ECOMM_TRACE(UNILOG_PLA_DRIVER, GsensorTriggerEvent_0, P_WARNING, 0, "I2C recv queue error");
  809. }
  810. }
  811. static INT32 I2CEvtProcess(uint32_t evt)
  812. {
  813. INT32 ret;
  814. #if SL_SC7A20_16BIT_8BIT
  815. INT16 xyzData[7];
  816. #else
  817. INT8 xyzData[7];
  818. #endif
  819. HAL_I2C_RecvControl(true);
  820. if(evt & I2C_INT1_REQ_BITMAP)
  821. {
  822. }
  823. if(evt & I2C_INT2_REQ_BITMAP)
  824. {
  825. SL_SC7A20_Read_XYZ_Data(xyzData);
  826. }
  827. return 0;
  828. }
  829. static void HAL_I2C_RecvTaskEntry(void)
  830. {
  831. while(1)
  832. {
  833. uint32_t flag,mask;
  834. osStatus_t status;
  835. i2c_recv_msgqueue_obj_t msg;
  836. flag = osEventFlagsWait(g_i2CRecvFlag, I2C_RECV_CONTROL_FLAG, osFlagsNoClear | osFlagsWaitAll, osWaitForever);
  837. EC_ASSERT(flag == I2C_RECV_CONTROL_FLAG, flag, 0, 0);
  838. status = osMessageQueueGet(i2c_recv_msgqueue, &msg, 0 , osWaitForever);
  839. if(status == osOK)
  840. {
  841. mask = SaveAndSetIRQMask();
  842. //handle data
  843. //I2CEvtProcess(msg.event);
  844. #ifdef USING_PRINTF
  845. printf("[%d]i2c recv event\r\n",__LINE__);
  846. #else
  847. ECOMM_TRACE(UNILOG_PLA_DRIVER, I2C_GSENSOR_D, P_INFO, 0, "i2c recv event");
  848. #endif
  849. RestoreIRQMask(mask);
  850. }
  851. }
  852. }
  853. static void HAL_I2C_CreateRecvTaskAndQueue(void)
  854. {
  855. if(g_halI2CInitFlag & HAL_I2C_RECV_TASK_QUEUE_CREATED)
  856. {
  857. return;
  858. }
  859. /*
  860. for task create
  861. */
  862. osThreadId_t threadId;
  863. osThreadAttr_t task_attr;
  864. /*for msg queue create*/
  865. osMessageQueueAttr_t queue_attr;
  866. g_i2CRecvFlag = osEventFlagsNew(NULL);
  867. EC_ASSERT(g_i2CRecvFlag, g_i2CRecvFlag, 0, 0);
  868. memset(&queue_attr, 0, sizeof(queue_attr));
  869. queue_attr.cb_mem = &i2c_recv_queue_cb;
  870. queue_attr.cb_size = sizeof(i2c_recv_queue_cb);
  871. queue_attr.mq_mem = i2c_recv_queue_buf;
  872. queue_attr.mq_size = sizeof(i2c_recv_queue_buf);
  873. i2c_recv_msgqueue = osMessageQueueNew(I2C_RECV_QUEUE_BUF_SIZE,sizeof(i2c_recv_msgqueue_obj_t), &queue_attr);
  874. EC_ASSERT(i2c_recv_msgqueue, i2c_recv_msgqueue, 0, 0);
  875. memset(& task_attr, 0, sizeof(task_attr));
  876. memset(i2c_recv_task_stack, 0xA5, I2C_RECV_TASK_STACK_SIZE);
  877. task_attr.name = "GsensorRecv";
  878. task_attr.stack_size = I2C_RECV_TASK_STACK_SIZE;
  879. task_attr.stack_mem = i2c_recv_task_stack;
  880. task_attr.priority = osPriorityNormal;
  881. task_attr.cb_mem = &i2c_recv_task;
  882. task_attr.cb_size = sizeof(StaticTask_t);
  883. threadId = osThreadNew(HAL_I2C_RecvTaskEntry, NULL, &task_attr);
  884. EC_ASSERT(threadId, threadId, 0, 0);
  885. g_halI2CInitFlag |= HAL_I2C_RECV_TASK_QUEUE_CREATED;
  886. }
  887. /**
  888. \fn void GsensorI2CCallback(uint32_t event)
  889. \param[in] event : i2c irq event
  890. \brief i2c irq event ,callback function
  891. \return
  892. */
  893. void GsensorI2CHandler(ARM_I2C_SignalEvent_t cb_event)
  894. {
  895. // Initialize with callback
  896. i2cDrvInstance->Initialize(cb_event);
  897. // Power on
  898. i2cDrvInstance->PowerControl(ARM_POWER_FULL);
  899. // Configure I2C bus
  900. i2cDrvInstance->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_STANDARD);
  901. i2cDrvInstance->Control(ARM_I2C_BUS_CLEAR, 0);
  902. HAL_I2C_CreateRecvTaskAndQueue();
  903. #ifdef USING_PRINTF
  904. printf("[%d] i2c config ok\r\n",__LINE__);
  905. #else
  906. ECOMM_TRACE(UNILOG_PLA_DRIVER, I2C_GSENSOR_I, P_INFO, 0, "i2c config ok");
  907. #endif
  908. }
  909. /**
  910. \fn void GPSSendStr(uint8_t* strPtr, uint16_t strLen)
  911. \param[in] strPtr for gps usart port;
  912. \brief
  913. \return
  914. */
  915. void GPSSendStr(uint8_t* strPtr, uint16_t strLen)
  916. {
  917. HAL_UART_SendStr(PORT_USART_2,strPtr,strLen);
  918. }
  919. /**
  920. \fn void GpsDataRecvCallback(uint32_t event, void* dataPtr, uint32_t dataLen)
  921. \param[in] event :Data receiving timeout processing and data receiving completion processing;
  922. \ dataPtr : Point to receive data buff
  923. \ dataLen : Received data length
  924. \brief i2c irq event ,callback function
  925. \return
  926. */
  927. void GpsDataRecvCallback(UINT32 event, void* dataPtr, UINT32 dataLen)
  928. {
  929. if((event == ARM_USART_EVENT_RX_TIMEOUT) || (event == ARM_USART_EVENT_RECEIVE_COMPLETE)){
  930. #ifdef USING_PRINTF
  931. // printf("GpsDataRecvCallback [%d] %s\r\n",dataLen,dataPtr);
  932. #endif
  933. if(dataLen>0){
  934. gpsReqMsg gpsInfo;
  935. gpsInfo.dataPtr=malloc(dataLen+1);
  936. if(gpsInfo.dataPtr){
  937. memcpy(gpsInfo.dataPtr,dataPtr,dataLen);
  938. gpsInfo.len=dataLen;
  939. osMessageQueuePut(gpsMsgHandle, &gpsInfo, 0, 2000);
  940. }
  941. }
  942. }
  943. slpManStartWaitATTimer();
  944. }
  945. /**
  946. \fn void GPSUsartHandler(ARM_DRIVER_USART * uartDriverHandler, uint32_t baudRate)
  947. \param[in] baudRate for gps usart port;
  948. \brief config gps usart port
  949. \return
  950. */
  951. void GPSUsartHandler(UINT32 baudRate)
  952. {
  953. hal_uart_config_t halUartConfig = {0};
  954. hal_uart_hardware_config_t hwConfig = {
  955. ARM_POWER_FULL,
  956. ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_8 |
  957. ARM_USART_PARITY_NONE | ARM_USART_STOP_BITS_1 |
  958. ARM_USART_FLOW_CONTROL_NONE,
  959. baudRate
  960. };
  961. halUartConfig.uartDriverHandler = usartHandle;
  962. halUartConfig.recv_cb = GpsDataRecvCallback;
  963. halUartConfig.recvBuffPtr = gps_uart_recv_buf;
  964. halUartConfig.recvBuffSize = GPS_DATA_RECV_BUFFER_SIZE;
  965. HAL_UART_InitHandler(PORT_USART_2, &halUartConfig, &hwConfig, HAL_UART_TASK_CREATE_FLAG_SEND_RECV);
  966. HAL_UART_RecvFlowControl(false);
  967. }
  968. /**
  969. \fn INT32 AdcGetRes(UINT32 NTCvalue)
  970. \param[in] req : NTCvalue
  971. \brief
  972. \return Resvalue
  973. */
  974. static INT32 AdcGetRes(UINT32 NTCvalue){
  975. UINT32 Resvalue;
  976. if(NTCvalue>=(ADC_ChannelAioVbat-100))
  977. Resvalue=1000000;
  978. else{
  979. Resvalue=ADC_ChannelAioRes*NTCvalue/(ADC_ChannelAioVbat-NTCvalue);
  980. }
  981. return Resvalue;
  982. }
  983. /**
  984. \fn INT32 AdcSendReq(UINT32 req,UINT32 * param ,UINT32 timeout)
  985. \param[in] req : ADC_REQ_BITMAP_VBAT ADC_REQ_BITMAP_TEMP; timeout = 0 at irq ,otherwize equal to ADC_MSG_TIMEOUT
  986. \brief return bat value ,trigger deinit
  987. \return 1 FAIL , 0 OK
  988. */
  989. INT32 AdcSendReq(UINT32 req,UINT32 * param , UINT8 len ,UINT32 timeout)
  990. {
  991. INT32 ret;
  992. adcReqMsg ReqMsg;
  993. ReqMsg.request = req;
  994. ReqMsg.param[NTC_Channel1] = ReqMsg.param[NTC_Channel2] = ReqMsg.param[NTC_Channel3] = ReqMsg.param[NTC_Channel4] = ReqMsg.param[NTC_Channel5] =ADC_AioResDivRatioDefault ;
  995. ret = osMessageQueuePut(adcMsgHandle, &ReqMsg, 0, timeout);
  996. if(ret != osOK)
  997. {
  998. return ret;
  999. }
  1000. else
  1001. {
  1002. ret = osEventFlagsWait(adcTrigerHandle, ADC_RECV_CONTROL_FLAG, osFlagsWaitAll, timeout);
  1003. //to do
  1004. switch(req)
  1005. {
  1006. case ADC_REQ_BITMAP_VBAT:
  1007. param[0] = gNtcDev.NTCvalue[0];
  1008. break;
  1009. case ADC_REQ_BITMAP_TEMP:
  1010. param[0] = gNtcDev.NTCvalue[1];
  1011. break;
  1012. case ADC_REQ_BITMAP_CH1:
  1013. param[0] = AdcGetRes(gNtcDev.NTCvalue[2+NTC_Channel1]);
  1014. break;
  1015. case ADC_REQ_BITMAP_CH2:
  1016. param[0] =AdcGetRes(gNtcDev.NTCvalue[2+NTC_Channel2]);
  1017. break;
  1018. case ADC_REQ_BITMAP_CH3:
  1019. param[0] =AdcGetRes(gNtcDev.NTCvalue[2+NTC_Channel3]);
  1020. break;
  1021. case ADC_REQ_BITMAP_CH4:
  1022. param[0] = AdcGetRes(gNtcDev.NTCvalue[2+NTC_Channel4]);
  1023. break;
  1024. case ADC_REQ_BITMAP_CH5:
  1025. param[0] = AdcGetRes(gNtcDev.NTCvalue[2+NTC_Channel5]);
  1026. break;
  1027. }
  1028. osEventFlagsClear(adcTrigerHandle, ADC_RECV_CONTROL_FLAG);
  1029. return ret;
  1030. }
  1031. }
  1032. /**
  1033. \fn static void ADC_VbatChannelCallback(uint32_t result)
  1034. \param[in]
  1035. \brief return bat value ,trigger deinit
  1036. \return
  1037. */
  1038. static void ADC_VbatChannelCallback(uint32_t result)
  1039. {
  1040. vbatChannelResult = result;
  1041. osEventFlagsSet(adcEvtHandle, ADC_REQ_BITMAP_VBAT);
  1042. }
  1043. /**
  1044. \fn static void ADC_ThermalChannelCallback(uint32_t result)
  1045. \param[in]
  1046. \brief return thermal value ,trigger deinit
  1047. \return
  1048. */
  1049. static void ADC_ThermalChannelCallback(uint32_t result)
  1050. {
  1051. thermalChannelResult = result;
  1052. osEventFlagsSet(adcEvtHandle, ADC_REQ_BITMAP_TEMP);
  1053. }
  1054. static void ADC_NTC1ChannelCallback(uint32_t result)
  1055. {
  1056. NTCChannelResult[NTC_Channel1] = result;
  1057. osEventFlagsSet(adcEvtHandle, ADC_REQ_BITMAP_CH1);
  1058. }
  1059. static void ADC_NTC2ChannelCallback(uint32_t result)
  1060. {
  1061. NTCChannelResult[NTC_Channel2] = result;
  1062. osEventFlagsSet(adcEvtHandle, ADC_REQ_BITMAP_CH2);
  1063. }
  1064. static void ADC_NTC3ChannelCallback(uint32_t result)
  1065. {
  1066. NTCChannelResult[NTC_Channel3] = result;
  1067. osEventFlagsSet(adcEvtHandle, ADC_REQ_BITMAP_CH3);
  1068. }
  1069. static void ADC_NTC4OR5ChannelCallback(uint32_t result)
  1070. {
  1071. if(gNtcDev.flagC4){
  1072. NTCChannelResult[NTC_Channel4] = result;
  1073. osEventFlagsSet(adcEvtHandle, ADC_REQ_BITMAP_CH4);
  1074. }else{
  1075. NTCChannelResult[NTC_Channel5] = result;
  1076. osEventFlagsSet(adcEvtHandle, ADC_REQ_BITMAP_CH5);
  1077. }
  1078. }
  1079. /**
  1080. \fn void AdcProcess(void* arg)
  1081. \param[in]
  1082. \brief handle adc init ,deinit and convert process
  1083. \return
  1084. */
  1085. static void AdcProcess(void* arg)
  1086. {
  1087. adcReqMsg regMsg;
  1088. INT32 ret;
  1089. while(1)
  1090. {
  1091. /*
  1092. */
  1093. osMessageQueueGet(adcMsgHandle, &regMsg, 0, osWaitForever);
  1094. /*
  1095. handle event
  1096. */
  1097. adc_config_t adcConfig;
  1098. INT8 times=1;
  1099. ADC_GetDefaultConfig(&adcConfig);
  1100. osEventFlagsClear(adcEvtHandle, regMsg.request);
  1101. retry:
  1102. if(regMsg.request & ADC_REQ_BITMAP_VBAT)
  1103. {
  1104. adcConfig.channelConfig.vbatResDiv = ADC_VbatResDivRatio3Over16;
  1105. ADC_ChannelInit(ADC_ChannelVbat, ADC_UserAPP, &adcConfig, ADC_VbatChannelCallback);
  1106. ADC_StartConversion(ADC_ChannelVbat, ADC_UserAPP);
  1107. }
  1108. if(regMsg.request & ADC_REQ_BITMAP_TEMP)
  1109. {
  1110. adcConfig.channelConfig.thermalInput = ADC_ThermalInputVbat;
  1111. ADC_ChannelInit(ADC_ChannelThermal, ADC_UserAPP, &adcConfig, ADC_ThermalChannelCallback);
  1112. ADC_StartConversion(ADC_ChannelThermal, ADC_UserAPP);
  1113. }
  1114. if(regMsg.request & ADC_REQ_BITMAP_CH1)
  1115. {
  1116. if(regMsg.param[NTC_Channel1]>=ADC_AioResDivRatio1 && regMsg.param[NTC_Channel1]<=ADC_AioResDivRatio1Over16){
  1117. adcConfig.channelConfig.aioResDiv = regMsg.param[NTC_Channel1];
  1118. }else{
  1119. adcConfig.channelConfig.aioResDiv = ADC_AioResDivRatioDefault;
  1120. }
  1121. ADC_ChannelInit(ADC_ChannelAio1, ADC_UserAPP, &adcConfig, ADC_NTC1ChannelCallback);
  1122. ADC_StartConversion(ADC_ChannelAio1, ADC_UserAPP);
  1123. }
  1124. if(regMsg.request & ADC_REQ_BITMAP_CH2)
  1125. {
  1126. if(regMsg.param[NTC_Channel2]>=ADC_AioResDivRatio1 && regMsg.param[NTC_Channel2]<=ADC_AioResDivRatio1Over16){
  1127. adcConfig.channelConfig.aioResDiv = regMsg.param[NTC_Channel2];
  1128. }else{
  1129. adcConfig.channelConfig.aioResDiv = ADC_AioResDivRatioDefault;
  1130. }
  1131. ADC_ChannelInit(ADC_ChannelAio2, ADC_UserAPP, &adcConfig, ADC_NTC2ChannelCallback);
  1132. ADC_StartConversion(ADC_ChannelAio2, ADC_UserAPP);
  1133. }
  1134. if(regMsg.request & ADC_REQ_BITMAP_CH3)
  1135. {
  1136. if(regMsg.param[NTC_Channel3]>=ADC_AioResDivRatio1 && regMsg.param[NTC_Channel3]<=ADC_AioResDivRatio1Over16){
  1137. adcConfig.channelConfig.aioResDiv = regMsg.param[NTC_Channel3];
  1138. }else{
  1139. adcConfig.channelConfig.aioResDiv = ADC_AioResDivRatioDefault;
  1140. }
  1141. ADC_ChannelInit(ADC_ChannelAio3, ADC_UserAPP, &adcConfig, ADC_NTC3ChannelCallback);
  1142. ADC_StartConversion(ADC_ChannelAio3, ADC_UserAPP);
  1143. }
  1144. if(regMsg.request & ADC_REQ_BITMAP_CH4 ||regMsg.request & ADC_REQ_BITMAP_CH5)
  1145. {
  1146. if(regMsg.request & ADC_REQ_BITMAP_CH4){
  1147. gNtcDev.flagC4 = 1;
  1148. GPIO_PinWrite(0, 1, 1);
  1149. if(regMsg.param[NTC_Channel4]>=ADC_AioResDivRatio1 && regMsg.param[NTC_Channel4]<=ADC_AioResDivRatio1Over16){
  1150. adcConfig.channelConfig.aioResDiv = regMsg.param[NTC_Channel4];
  1151. }else{
  1152. adcConfig.channelConfig.aioResDiv = ADC_AioResDivRatioDefault;
  1153. }
  1154. }else{
  1155. GPIO_PinWrite(0, 1, 0);
  1156. gNtcDev.flagC4 = 0;
  1157. if(regMsg.param[NTC_Channel5]>=ADC_AioResDivRatio1 && regMsg.param[NTC_Channel5]<=ADC_AioResDivRatio1Over16){
  1158. adcConfig.channelConfig.aioResDiv = regMsg.param[NTC_Channel5];
  1159. }else{
  1160. adcConfig.channelConfig.aioResDiv = ADC_AioResDivRatioDefault;
  1161. }
  1162. }
  1163. ADC_ChannelInit(ADC_ChannelAio4, ADC_UserAPP, &adcConfig, ADC_NTC4OR5ChannelCallback);
  1164. ADC_StartConversion(ADC_ChannelAio4, ADC_UserAPP);
  1165. }
  1166. ret = osEventFlagsWait(adcEvtHandle, regMsg.request, osFlagsWaitAll, ADC_GET_RESULT_TIMOUT);
  1167. if(regMsg.request & ADC_REQ_BITMAP_VBAT)
  1168. {
  1169. ADC_ChannelDeInit(ADC_ChannelVbat, ADC_UserAPP);
  1170. gNtcDev.NTCvalue[0] = HAL_ADC_CalibrateRawCode(vbatChannelResult) * 16 / 3;
  1171. }
  1172. if(regMsg.request & ADC_REQ_BITMAP_TEMP)
  1173. {
  1174. ADC_ChannelDeInit(ADC_ChannelThermal, ADC_UserAPP);
  1175. gNtcDev.NTCvalue[1] = HAL_ADC_ConvertThermalRawCodeToTemperature(thermalChannelResult);
  1176. }
  1177. if(regMsg.request & ADC_REQ_BITMAP_CH1)
  1178. {
  1179. ADC_ChannelDeInit(ADC_ChannelAio1, ADC_UserAPP);
  1180. if(times==1){
  1181. gNtcDev.NTCvalue[2+NTC_Channel1]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel1])*REV_AioResDivRatioDefault;
  1182. if(gNtcDev.NTCvalue[2+NTC_Channel1]>(NTC_FullAioValue-100)){
  1183. regMsg.param[NTC_Channel1]=ADC_AioResDivRatioExtra;
  1184. times++;
  1185. goto retry;
  1186. }
  1187. }else{
  1188. gNtcDev.NTCvalue[2+NTC_Channel1]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel1])*REV_AioResDivRatioExtra;
  1189. }
  1190. }
  1191. if(regMsg.request & ADC_REQ_BITMAP_CH2)
  1192. {
  1193. ADC_ChannelDeInit(ADC_ChannelAio2, ADC_UserAPP);
  1194. if(times==1){
  1195. gNtcDev.NTCvalue[2+NTC_Channel2]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel2])*REV_AioResDivRatioDefault;
  1196. if(gNtcDev.NTCvalue[2+NTC_Channel2]>(NTC_FullAioValue-100)){
  1197. regMsg.param[NTC_Channel2]=ADC_AioResDivRatioExtra;
  1198. times++;
  1199. goto retry;
  1200. }
  1201. }else{
  1202. gNtcDev.NTCvalue[2+NTC_Channel2]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel2])*REV_AioResDivRatioExtra;
  1203. }
  1204. }
  1205. if(regMsg.request & ADC_REQ_BITMAP_CH3)
  1206. {
  1207. ADC_ChannelDeInit(ADC_ChannelAio3, ADC_UserAPP);
  1208. if(times==1){
  1209. gNtcDev.NTCvalue[2+NTC_Channel3]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel3])*REV_AioResDivRatioDefault;
  1210. if(gNtcDev.NTCvalue[2+NTC_Channel3]>(NTC_FullAioValue-100)){
  1211. regMsg.param[NTC_Channel3]=ADC_AioResDivRatioExtra;
  1212. times++;
  1213. goto retry;
  1214. }
  1215. }else{
  1216. gNtcDev.NTCvalue[2+NTC_Channel3]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel3])*REV_AioResDivRatioExtra;
  1217. }
  1218. }
  1219. if(regMsg.request & ADC_REQ_BITMAP_CH4 ||regMsg.request & ADC_REQ_BITMAP_CH5)
  1220. {
  1221. ADC_ChannelDeInit(ADC_ChannelAio4, ADC_UserAPP);
  1222. if(gNtcDev.flagC4){
  1223. if(times==1){
  1224. gNtcDev.NTCvalue[2+NTC_Channel4]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel4])*REV_AioResDivRatioDefault;
  1225. if(gNtcDev.NTCvalue[2+NTC_Channel4]>(NTC_FullAioValue-100)){
  1226. regMsg.param[NTC_Channel4]=ADC_AioResDivRatioExtra;
  1227. times++;
  1228. goto retry;
  1229. }
  1230. }else{
  1231. gNtcDev.NTCvalue[2+NTC_Channel4]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel4])*REV_AioResDivRatioExtra;
  1232. }
  1233. }else{
  1234. if(times==1){
  1235. gNtcDev.NTCvalue[2+NTC_Channel5]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel5])*REV_AioResDivRatioDefault;
  1236. if(gNtcDev.NTCvalue[2+NTC_Channel5]>(NTC_FullAioValue-100)){
  1237. regMsg.param[NTC_Channel5]=ADC_AioResDivRatioExtra;
  1238. times++;
  1239. goto retry;
  1240. }
  1241. }else{
  1242. gNtcDev.NTCvalue[2+NTC_Channel5]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel5])*REV_AioResDivRatioExtra;
  1243. }
  1244. }
  1245. }
  1246. osEventFlagsSet(adcTrigerHandle, ADC_RECV_CONTROL_FLAG);
  1247. }
  1248. }
  1249. /**
  1250. \fn INT32 AdcTaskInit(void)
  1251. \param[in]
  1252. \brief create task for checking bat level
  1253. \return
  1254. */
  1255. INT32 AdcTaskInit(void)
  1256. {
  1257. gpio_pin_config_t config;
  1258. config.pinDirection = GPIO_DirectionOutput;
  1259. config.misc.initOutput = 1;
  1260. pad_config_t padConfig;
  1261. PAD_GetDefaultConfig(&padConfig);
  1262. padConfig.mux = PAD_MuxAlt0;
  1263. PAD_SetPinConfig(11, &padConfig);
  1264. GPIO_PinConfig(0, 0, &config);
  1265. GPIO_PinWrite(0, 1, 1);
  1266. memset(&gNtcDev , 0 ,sizeof(NtcResult_t));
  1267. if(adcMsgHandle == NULL)
  1268. {
  1269. adcMsgHandle = osMessageQueueNew(ADC_MSG_MAX_NUM,sizeof(adcReqMsg), NULL);
  1270. if(adcMsgHandle == NULL)
  1271. return 1;
  1272. }
  1273. if(adcTrigerHandle == NULL)
  1274. {
  1275. adcTrigerHandle = osEventFlagsNew(NULL);
  1276. if(adcTrigerHandle == NULL)
  1277. return 1;
  1278. }
  1279. if(adcEvtHandle == NULL)
  1280. {
  1281. adcEvtHandle = osEventFlagsNew(NULL);
  1282. if(adcEvtHandle == NULL)
  1283. return 1;
  1284. }
  1285. if(adcTaskHandle == NULL)
  1286. {
  1287. osThreadAttr_t task_attr;
  1288. memset(&task_attr , 0 , sizeof(task_attr));
  1289. task_attr.name = "batAdc";
  1290. task_attr.priority = osPriorityNormal1;
  1291. task_attr.cb_mem = &adcTask;
  1292. task_attr.cb_size = sizeof(StaticTask_t);
  1293. task_attr.stack_mem = adcTaskStack;
  1294. task_attr.stack_size =ADC_TASK_STACK_SIZE;
  1295. memset(& adcTaskStack, 0xa5, ADC_TASK_STACK_SIZE);
  1296. adcTaskHandle = osThreadNew(AdcProcess , NULL,&task_attr);
  1297. if(adcTaskHandle == NULL)
  1298. return 1;
  1299. }
  1300. return 0;
  1301. }
  1302. /**
  1303. \fn void PowerPinConfig(IOType iotype)
  1304. \param[in]
  1305. \brief config PWR pin to gpiol
  1306. \return
  1307. */
  1308. void PowerPinConfig(IOType iotype)
  1309. {
  1310. gpio_pin_config_t config;
  1311. config.pinDirection = GPIO_DirectionOutput;
  1312. config.misc.initOutput = 1;
  1313. pad_config_t padConfig;
  1314. PAD_GetDefaultConfig(&padConfig);
  1315. if(iotype == AON_IO)
  1316. {
  1317. padConfig.mux = PAD_MuxAlt0;
  1318. PAD_SetPinConfig(31, &padConfig);
  1319. GPIO_PinConfig(1, AON_GPS_POWER2, &config);
  1320. GPIO_PinWrite(1, 1 << AON_GPS_POWER2, 1 << AON_RELAY_DRV);
  1321. PAD_SetPinConfig(32, &padConfig);
  1322. GPIO_PinConfig(1, AON_RELAY_DRV, &config);
  1323. GPIO_PinWrite(1, 1 << AON_RELAY_DRV, 1 << AON_RELAY_DRV);
  1324. PAD_SetPinConfig(35, &padConfig);
  1325. GPIO_PinConfig(1, AON_WAKEUP, &config);
  1326. GPIO_PinWrite(1, 1 << AON_WAKEUP, 1 << AON_WAKEUP);
  1327. padConfig.mux = PAD_MuxAlt7;
  1328. PAD_SetPinConfig(5, &padConfig);
  1329. GPIO_PinConfig(1, FEM_GPS_RSTN, &config);
  1330. GPIO_PinWrite(1, 1 << FEM_GPS_RSTN, 1 << FEM_GPS_RSTN);
  1331. #if 1
  1332. padConfig.mux = PAD_MuxAlt7;
  1333. padConfig.pullSelect = PAD_PullInternal;
  1334. padConfig.pullUpEnable = PAD_PullUpEnable;
  1335. padConfig.pullDownEnable = PAD_PullDownDisable;
  1336. PAD_SetPinConfig(8, &padConfig);
  1337. config.pinDirection = GPIO_DirectionInput;
  1338. config.misc.initOutput = 0;
  1339. GPIO_PinConfig(1, FEM_GPS_PPS, &config);
  1340. #else
  1341. padConfig.mux = PAD_MuxAlt7;
  1342. PAD_SetPinConfig(8, &padConfig);
  1343. GPIO_PinWrite(1, 1 << FEM_GPS_PPS, 1 << FEM_GPS_PPS);
  1344. #endif
  1345. }
  1346. else
  1347. {
  1348. /*Normal IO*/
  1349. #if 0
  1350. GPIO_PinConfig(0, GPIO_MOS_DRV1, &config);
  1351. GPIO_PinWrite(0, 1 << GPIO_MOS_DRV1, 1 << GPIO_MOS_DRV1);
  1352. GPIO_PinConfig(0, GPIO_MOS_DRV2, &config);
  1353. GPIO_PinWrite(0, 1 << GPIO_MOS_DRV2, 1 << GPIO_MOS_DRV2);
  1354. #endif
  1355. padConfig.mux = PAD_MuxAlt0;
  1356. PAD_SetPinConfig(28, &padConfig);
  1357. GPIO_PinConfig(0, GPIO_POWER_LED, &config);
  1358. GPIO_PinWrite(0, 1 << GPIO_POWER_LED, 1 << GPIO_POWER_LED);
  1359. }
  1360. }
  1361. /**
  1362. \fn void posGGAReset(void)
  1363. \param[in]
  1364. \brief reset gps
  1365. \return
  1366. */
  1367. void posGGAReset(void)
  1368. {
  1369. gpio_pin_config_t config;
  1370. config.pinDirection = GPIO_DirectionOutput;
  1371. config.misc.initOutput = 1;
  1372. pad_config_t padConfig;
  1373. PAD_GetDefaultConfig(&padConfig);
  1374. padConfig.mux = PAD_MuxAlt7;
  1375. PAD_SetPinConfig(5, &padConfig);
  1376. GPIO_PinConfig(1, FEM_GPS_RSTN, &config);
  1377. GPIO_PinWrite(1, 1 << FEM_GPS_RSTN, 0);
  1378. osDelay(1000/portTICK_PERIOD_MS);
  1379. GPIO_PinConfig(1, FEM_GPS_RSTN, &config);
  1380. GPIO_PinWrite(1, 1 << FEM_GPS_RSTN, 1 << FEM_GPS_RSTN);
  1381. }
  1382. /**
  1383. \fn void GPSPowerCtr(bool )
  1384. \param[in]
  1385. \brief reset gps
  1386. \return
  1387. */
  1388. void GPSPowerCtr(bool on)
  1389. {
  1390. gpio_pin_config_t config;
  1391. config.pinDirection = GPIO_DirectionOutput;
  1392. config.misc.initOutput = 1;
  1393. pad_config_t padConfig;
  1394. PAD_GetDefaultConfig(&padConfig);
  1395. padConfig.mux = PAD_MuxAlt0;
  1396. PAD_SetPinConfig(31, &padConfig);
  1397. GPIO_PinConfig(1, AON_GPS_POWER2, &config);
  1398. if(on){
  1399. GPIO_PinWrite(1, 1 << AON_GPS_POWER2, 0);
  1400. }else{
  1401. GPIO_PinWrite(1, 1 << AON_GPS_POWER2, 1<<AON_GPS_POWER2);
  1402. }
  1403. }
  1404. /**
  1405. \fn void posGGAServiceStart(posGGACallBack )
  1406. \param[in]
  1407. \brief powr on gps
  1408. \return
  1409. */
  1410. INT32 posGGAServiceStart( posGGACallBack callBack)
  1411. {
  1412. if(callBack == NULL){
  1413. return -1;
  1414. }else{
  1415. GPSPowerCtr(true);
  1416. GPSUsartHandler(9600);
  1417. gGPSDataCBfunc = callBack;
  1418. return 0;
  1419. }
  1420. }
  1421. /**
  1422. \fn void posGGAServiceStop(void )
  1423. \param[in]
  1424. \brief stop gps
  1425. \return
  1426. */
  1427. void posGGAServiceStop( void)
  1428. {
  1429. HAL_UART_DeInitHandler(PORT_USART_2);
  1430. GPSPowerCtr(false);
  1431. gGPSDataCBfunc = NULL;
  1432. }
  1433. /**
  1434. \fn void gpsProcess(void* arg)
  1435. \param[in]
  1436. \brief handle gps init ,deinit and convert process
  1437. \return
  1438. */
  1439. static void GpsProcess(void* arg)
  1440. {
  1441. gpsReqMsg msg;
  1442. #ifdef USING_PRINTF
  1443. printf("%s[%d]\r\n",__FUNCTION__, __LINE__);
  1444. #endif
  1445. while(1)
  1446. {
  1447. /*
  1448. */
  1449. osMessageQueueGet(gpsMsgHandle, &msg, 0, osWaitForever);
  1450. #ifdef USING_PRINTF
  1451. printf("GpsProcess Gpstask [%d] %s\r\n",msg.len,msg.dataPtr);
  1452. #endif
  1453. osMessageQueuePut(gpsMsgQueue, &msg, 0, 2000);
  1454. if(msg.dataPtr)
  1455. free(msg.dataPtr);
  1456. msg.dataPtr=NULL;
  1457. if (Sleep_Flag)
  1458. {
  1459. osThreadExit();
  1460. break;
  1461. }
  1462. }
  1463. }
  1464. /**
  1465. \fn INT32 GpsTaskInit(void)
  1466. \param[in]
  1467. \brief create task for checking gps data
  1468. \return
  1469. */
  1470. INT32 GpsTaskInit(void)
  1471. {
  1472. if(gpsMsgHandle == NULL)
  1473. {
  1474. gpsMsgHandle = osMessageQueueNew(1,sizeof(gpsReqMsg), NULL);
  1475. if(gpsMsgHandle == NULL)
  1476. return 1;
  1477. }
  1478. if(gpsTaskHandle == NULL)
  1479. {
  1480. osThreadAttr_t task_attr;
  1481. memset(&task_attr , 0 , sizeof(task_attr));
  1482. task_attr.name = "GPS";
  1483. task_attr.priority = osPriorityNormal1;
  1484. task_attr.cb_mem = &gpsTask;
  1485. task_attr.cb_size = sizeof(StaticTask_t);
  1486. task_attr.stack_mem = gpsTaskStack;
  1487. task_attr.stack_size =GPS_TASK_STACK_SIZE;
  1488. memset(& gpsTaskStack, 0xa5, GPS_TASK_STACK_SIZE);
  1489. gpsTaskHandle = osThreadNew(GpsProcess , NULL,&task_attr);
  1490. if(gpsTaskHandle == NULL)
  1491. return 1;
  1492. }
  1493. return 0;
  1494. }