hal_module_adapter.c 42 KB

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