hal_module_adapter.c 61 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140
  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_AioResDivRatio14Over16)
  59. #define REV_AioResDivRatioDefault 16/14
  60. //#define ADC_ChannelAioVbat (1200)
  61. static UINT32 ADC_ChannelAioVbat=1200;
  62. #define ADC_ChannelAioRes (15000)
  63. #define NTC_FullAioValue (1200)
  64. #define ADC_AioResDivRatioExtra (ADC_AioResDivRatio8Over16)
  65. #define REV_AioResDivRatioExtra 16/8
  66. #define NTC_REQ_UPDATE_DATA (0x01)
  67. #define ADC_MSG_TIMEOUT (1000)
  68. #define ADC_CALIBRATION_VALUE (50900)
  69. static UINT32 ADC_InsideRES=500000;
  70. #define ADC_RECV_CONTROL_FLAG (0x1)
  71. typedef struct
  72. {
  73. UINT8 flagC4;
  74. UINT32 request;
  75. UINT32 NTCvalue[7];
  76. }NtcResult_t;
  77. NtcResult_t gNtcDev;
  78. volatile static UINT32 vbatChannelResult = 0;
  79. volatile static UINT32 thermalChannelResult = 0;
  80. volatile static UINT32 NTCChannelResult[NTC_ChannelMax];
  81. QueueHandle_t adcMsgHandle = NULL;
  82. static osEventFlagsId_t adcEvtHandle = NULL;
  83. static osEventFlagsId_t adcTrigerHandle = NULL;
  84. static osThreadId_t adcTaskHandle = NULL;
  85. static StaticTask_t adcTask = NULL;
  86. static UINT8 adcTaskStack[ADC_TASK_STACK_SIZE];
  87. /*
  88. gps
  89. */
  90. #define GPS_TASK_STACK_SIZE (2048)
  91. QueueHandle_t gpsMsgHandle = NULL;
  92. static osThreadId_t gpsTaskHandle = NULL;
  93. static StaticTask_t gpsTask = NULL;
  94. static UINT8 gpsTaskStack[GPS_TASK_STACK_SIZE];
  95. /*
  96. can
  97. */
  98. static osMessageQueueId_t can_recv_msgqueue;
  99. static StaticQueue_t can_recv_queue_cb;
  100. #define CAN_RECV_QUEUE_BUF_SIZE (0x10)
  101. static UINT8 can_recv_queue_buf[CAN_RECV_QUEUE_BUF_SIZE];
  102. #define CAN_RECV_CONTROL_FLAG (0x1)
  103. //#define SPI_ANALOG
  104. #ifdef SPI_ANALOG
  105. #define USING_SPI0 0
  106. #endif
  107. /*spi0*/
  108. #ifdef SPI_ANALOG
  109. #if USING_SPI0
  110. #define SPI_SSN_GPIO_INSTANCE RTE_SPI0_SSN_GPIO_INSTANCE
  111. #define SPI_SSN_GPIO_INDEX RTE_SPI0_SSN_GPIO_INDEX
  112. #define SPI_SSN_GPIO_PAD_ADDR 21
  113. #define SPI_CLK_GPIO_INSTANCE 0
  114. #define SPI_CLK_GPIO_INDEX 15
  115. #define SPI_CLK_GPIO_PAD_ADDR 24
  116. #define SPI_MOSI_GPIO_INSTANCE 0
  117. #define SPI_MOSI_GPIO_INDEX 11
  118. #define SPI_MOSI_GPIO_PAD_ADDR 22
  119. #define SPI_MISO_GPIO_INSTANCE 0
  120. #define SPI_MISO_GPIO_INDEX 14
  121. #define SPI_MISO_GPIO_PAD_ADDR 23
  122. #else //SPI1
  123. #define SPI_SSN_GPIO_INSTANCE RTE_SPI1_SSN_GPIO_INSTANCE
  124. #define SPI_SSN_GPIO_INDEX RTE_SPI1_SSN_GPIO_INDEX
  125. #define SPI_SSN_GPIO_PAD_ADDR 13
  126. #define SPI_CLK_GPIO_INSTANCE 0
  127. #define SPI_CLK_GPIO_INDEX 5
  128. #define SPI_CLK_GPIO_PAD_ADDR 16
  129. #define SPI_MOSI_GPIO_INSTANCE 0
  130. #define SPI_MOSI_GPIO_INDEX 3
  131. #define SPI_MOSI_GPIO_PAD_ADDR 14
  132. #define SPI_MISO_GPIO_INSTANCE 0
  133. #define SPI_MISO_GPIO_INDEX 4
  134. #define SPI_MISO_GPIO_PAD_ADDR 15
  135. #endif
  136. #else
  137. #define SPI_SSN_GPIO_INSTANCE RTE_SPI1_SSN_GPIO_INSTANCE
  138. #define SPI_SSN_GPIO_INDEX RTE_SPI1_SSN_GPIO_INDEX
  139. #endif
  140. extern ARM_DRIVER_I2C Driver_I2C0;
  141. extern ARM_DRIVER_SPI Driver_SPI0;
  142. extern ARM_DRIVER_SPI Driver_SPI1;
  143. extern ARM_DRIVER_USART Driver_USART2;
  144. uint8_t gps_uart_recv_buf[GPS_DATA_RECV_BUFFER_SIZE];
  145. static ARM_DRIVER_SPI *spiMasterDrv = &CREATE_SYMBOL(Driver_SPI, 1);
  146. static ARM_DRIVER_I2C *i2cDrvInstance = &CREATE_SYMBOL(Driver_I2C, 0);
  147. static ARM_DRIVER_USART *usartHandle = &CREATE_SYMBOL(Driver_USART, 2);
  148. //LED define pin index
  149. #define LED_INX_MAX (5)
  150. #define LED_PORT_0 (0)
  151. #define LED_PORT_1 (1)
  152. /*
  153. pin1~pin4 for soc display
  154. pin5 for fault display
  155. */
  156. #define LED_GPIO_PIN_1 (6)
  157. #define LED_PAD_INDEX1 (17)
  158. #define LED_GPIO_PIN_2 (7)
  159. #define LED_PAD_INDEX2 (18)
  160. #define LED_GPIO_PIN_3 (0)
  161. #define LED_PAD_INDEX3 (21)
  162. #define LED_GPIO_PIN_4 (11)
  163. #define LED_PAD_INDEX4 (22)
  164. #define LED_GPIO_PIN_5 (1)
  165. #define LED_PAD_INDEX5 (27)
  166. led_pin_config_t gLedCfg[LED_INX_MAX]={{LED_PORT_0,LED_GPIO_PIN_1,LED_PAD_INDEX1, PAD_MuxAlt0},\
  167. {LED_PORT_0,LED_GPIO_PIN_2,LED_PAD_INDEX2, PAD_MuxAlt0},\
  168. {LED_PORT_1,LED_GPIO_PIN_3,LED_PAD_INDEX3, PAD_MuxAlt0},\
  169. {LED_PORT_0,LED_GPIO_PIN_4,LED_PAD_INDEX4, PAD_MuxAlt0},\
  170. {LED_PORT_1,LED_GPIO_PIN_5,LED_PAD_INDEX5, PAD_MuxAlt0}};
  171. #ifdef BL_FILE_LOG
  172. #include <stdarg.h>
  173. static UINT8 blLogFileNux=0;
  174. //UTCת��Ϊ����ʱ�� ������ֱ�ӵ���
  175. static void UTCToBeijing(unsigned char * bjttbuf,unsigned int UTCyear,unsigned char UTCmonth,unsigned char UTCday,unsigned int UTChour,unsigned char UTCminute,unsigned char UTCsecond)
  176. {
  177. int year=0,month=0,day=0,hour=0;
  178. int lastday = 0;// �µ����һ������
  179. int lastlastday = 0;//���µ����һ������
  180. year=UTCyear;
  181. month=UTCmonth;
  182. day=UTCday;
  183. hour=UTChour+8;//UTC+8ת��Ϊ����ʱ��
  184. if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12)
  185. {
  186. lastday = 31;
  187. if(month == 3)
  188. {
  189. if((year%400 == 0)||(year%4 == 0 && year%100 != 0))//�ж��Ƿ�Ϊ����
  190. lastlastday = 29;//�����2��Ϊ29�죬ƽ��Ϊ28��
  191. else
  192. lastlastday = 28;
  193. }
  194. if(month == 8)
  195. lastlastday = 31;
  196. }
  197. else
  198. if(month == 4 || month == 6 || month == 9 || month == 11)
  199. {
  200. lastday = 30;
  201. lastlastday = 31;
  202. }
  203. else
  204. {
  205. lastlastday = 31;
  206. if((year%400 == 0)||(year%4 == 0 && year%100 != 0))//�����2��Ϊ29�죬ƽ��Ϊ28��
  207. lastday = 29;
  208. else
  209. lastday = 28;
  210. }
  211. if(hour >= 24)//�������ʱ���ڻ����24��00ʱ��Ӧ��ȥ24��00�����ڼ�һ��
  212. {
  213. hour -= 24;
  214. day += 1;
  215. if(day > lastday)//����������ڴ��ڸ������һ��ʱ��Ӧ��ȥ�������һ������ڣ��·ݼ���һ����
  216. {
  217. day -= lastday;
  218. month += 1;
  219. if(month > 12)//��������·ݴ���12��Ӧ��ȥ12����ݼ���1��
  220. {
  221. month -= 12;
  222. year += 1;
  223. }
  224. }
  225. }
  226. sprintf((char *)bjttbuf,"%04d-%02d-%02d %02d:%02d:%02d ",
  227. year,month,day,hour,UTCminute,UTCsecond); //UTC����ʱ����ת���ɱ���ʱ��
  228. }
  229. static void bluejoy_write_logfile(UINT8 * buf)
  230. {
  231. int32_t err;
  232. UINT32 Count;
  233. OSAFILE file;
  234. while(blLogFileNux){
  235. osDelay(10/portTICK_PERIOD_MS);
  236. }
  237. blLogFileNux=1;
  238. file = OsaFopen("blLog","wb");
  239. if(file==NULL){
  240. printf("blLog open fail!\r\n");
  241. blLogFileNux=0;
  242. return;
  243. }
  244. if(OsaFseek(file, 0, SEEK_END) != 0)
  245. {
  246. printf("Seek file failed [%d] \r\n",__LINE__);
  247. OsaFclose(file);
  248. blLogFileNux=0;
  249. return;
  250. }
  251. Count = OsaFwrite(buf, 1, strlen(buf), file);
  252. if(Count != (strlen(buf))){
  253. printf("blLog write fail!\r\n");
  254. }
  255. OsaFclose(file);
  256. blLogFileNux=0;
  257. }
  258. void bluejoy_read_logfile(void)
  259. {
  260. int32_t err;
  261. UINT32 Count;
  262. OSAFILE file;
  263. UINT8 rbuf[128+1]={0};
  264. UINT8 * flag_p;
  265. UINT16 pri_l;
  266. printf("%s start\r\n",__FUNCTION__);
  267. while(blLogFileNux){
  268. osDelay(10/portTICK_PERIOD_MS);
  269. }
  270. blLogFileNux=1;
  271. file = OsaFopen("blLog","rb");
  272. if(file==NULL){
  273. printf("blLog not exst!\r\n");
  274. blLogFileNux=0;
  275. return;
  276. }
  277. if(OsaFseek(file, 0, SEEK_SET) != 0)
  278. {
  279. printf("Seek file failed [%d] \r\n",__LINE__);
  280. OsaFclose(file);
  281. blLogFileNux=0;
  282. return;
  283. }
  284. do{
  285. memset(rbuf,0,128);
  286. Count = OsaFread(rbuf, 1, 128, file);
  287. printf("%s",rbuf);
  288. }while(Count==128);
  289. OsaFclose(file);
  290. blLogFileNux=0;
  291. printf("%s end! \r\n",__FUNCTION__);
  292. }
  293. void bluejoy_del_logfile(void)
  294. {
  295. UINT32 ret;
  296. printf("%s start! \r\n",__FUNCTION__);
  297. while(blLogFileNux){
  298. osDelay(10/portTICK_PERIOD_MS);
  299. }
  300. blLogFileNux=1;
  301. OsaFremove("blLog");
  302. blLogFileNux=0;
  303. FaultDisplay(LED_TURN_OFF);
  304. osDelay(1000/portTICK_PERIOD_MS);
  305. FaultDisplay(LED_TURN_ON);
  306. osDelay(1000/portTICK_PERIOD_MS);
  307. FaultDisplay(LED_TURN_OFF);
  308. osDelay(1000/portTICK_PERIOD_MS);
  309. FaultDisplay(LED_TURN_ON);
  310. }
  311. void bluejoy_printf(BlLogLevel level, const UINT8 *format, ...)
  312. {
  313. UINT8 buf[128+1];
  314. va_list args;
  315. OsaUtcTimeTValue timeUtc;
  316. UINT16 year;
  317. UINT8 month,day,hour,minite,sec;
  318. if(level<BL_LEVEL2)
  319. return;
  320. appGetSystemTimeUtcSync(&timeUtc);
  321. year=(timeUtc.UTCtimer1&0xffff0000)>>16;
  322. month=(timeUtc.UTCtimer1&0xff00)>>8;
  323. day=timeUtc.UTCtimer1&0xff;
  324. hour=(timeUtc.UTCtimer2&0xff000000)>>24;
  325. minite=(timeUtc.UTCtimer2&0xff0000)>>16;
  326. sec=(timeUtc.UTCtimer2&0xff00)>>8;
  327. memset(buf,0,128+1);
  328. UTCToBeijing(buf,year,month,day,hour,minite,sec);
  329. va_start(args, format);
  330. vsnprintf(buf+strlen(buf), 128-strlen(buf), format, args);
  331. va_end(args);
  332. printf("%s begin! \r\n",__FUNCTION__);
  333. bluejoy_write_logfile(buf);
  334. }
  335. #endif
  336. #if 0
  337. /**
  338. \fn void NetSocDisplay(UINT8 soc)
  339. \param[in] void
  340. \brief RSSI display on led
  341. \return
  342. */
  343. #define RSSI_LEVEL_0 (0)
  344. #define RSSI_LEVEL_10 (10)
  345. #define RSSI_LEVEL_20 (20)
  346. #define RSSI_LEVEL_25 (25)
  347. #define RSSI_LEVEL_30 (30)
  348. void NetSocDisplay(UINT8 soc)
  349. {
  350. UINT16 pinLevel[LED_INX_MAX-1] ={0};
  351. gpio_pin_config_t nGpioCfg={0};
  352. nGpioCfg.pinDirection = GPIO_DirectionOutput;
  353. nGpioCfg.misc.initOutput = 1;
  354. for(int8_t i=0;i< LED_INX_MAX-1;i++){
  355. GPIO_PinConfig(gLedCfg[i].pinPort, gLedCfg[i].pinInx, &nGpioCfg);
  356. }
  357. if(RSSI_LEVEL_0 < soc && soc <=RSSI_LEVEL_10)
  358. {
  359. pinLevel[0]=1;
  360. pinLevel[1]=pinLevel[2]=pinLevel[3]=0;
  361. }
  362. else if(RSSI_LEVEL_10 < soc && soc <=RSSI_LEVEL_20)
  363. {
  364. pinLevel[0]=pinLevel[1]=1;
  365. pinLevel[2]=pinLevel[3]=0;
  366. }
  367. else if(RSSI_LEVEL_20 < soc && soc <=RSSI_LEVEL_25)
  368. {
  369. pinLevel[0]=pinLevel[1]=pinLevel[2]=1;
  370. pinLevel[3]=0;
  371. }
  372. else if(RSSI_LEVEL_25 < soc && soc <=RSSI_LEVEL_30)
  373. {
  374. pinLevel[0]=pinLevel[1]=pinLevel[2]=pinLevel[3]=1;
  375. }
  376. for(UINT8 i=0; i<LED_INX_MAX-1; i++)
  377. {
  378. GPIO_PinWrite(gLedCfg[i].pinPort, 1<<gLedCfg[i].pinInx, pinLevel[i]<<gLedCfg[i].pinInx);
  379. }
  380. }
  381. #endif
  382. void NetSocDisplay(ledInx_t Inx , ledStaus_t level)
  383. {
  384. UINT16 pinLevel[LED_INX_MAX-1] ={0};
  385. gpio_pin_config_t nGpioCfg={0};
  386. nGpioCfg.pinDirection = GPIO_DirectionOutput;
  387. nGpioCfg.misc.initOutput = 1;
  388. pad_config_t padConfig;
  389. PAD_GetDefaultConfig(&padConfig);
  390. padConfig.mux = gLedCfg[Inx].padMutex;
  391. PAD_SetPinConfig(gLedCfg[Inx].padInx, &padConfig);
  392. PAD_SetPinPullConfig(gLedCfg[Inx].padInx, PAD_InternalPullDown);
  393. GPIO_PinConfig(gLedCfg[Inx].pinPort, gLedCfg[Inx].pinInx, &nGpioCfg);
  394. GPIO_PinWrite(gLedCfg[Inx].pinPort, 1<<gLedCfg[Inx].pinInx, level <<gLedCfg[Inx].pinInx);
  395. }
  396. /**
  397. \fn void FaultDisplay(ledStaus_t status)
  398. \param[in] status equal to 1 ,turn on red led ; status equal to 0 ,turn off red led
  399. \brief RSSI display on led
  400. \return
  401. */
  402. void FaultDisplay(ledStaus_t status)
  403. {
  404. gpio_pin_config_t nGpioCfg={0};
  405. nGpioCfg.pinDirection = GPIO_DirectionOutput;
  406. nGpioCfg.misc.initOutput = 1;
  407. pad_config_t padConfig;
  408. PAD_GetDefaultConfig(&padConfig);
  409. padConfig.mux = gLedCfg[4].padMutex;
  410. PAD_SetPinConfig(gLedCfg[4].padInx, &padConfig);
  411. PAD_SetPinPullConfig(gLedCfg[4].padInx, PAD_InternalPullDown);
  412. GPIO_PinConfig(gLedCfg[4].pinPort, gLedCfg[4].pinInx, &nGpioCfg);
  413. GPIO_PinWrite(gLedCfg[4].pinPort, 1<<gLedCfg[4].pinInx, status<<gLedCfg[4].pinInx);
  414. }
  415. /**
  416. * @brief
  417. * @param
  418. * @return
  419. */
  420. void SPI_CS_High(void)
  421. {
  422. GPIO_PinWrite(SPI_SSN_GPIO_INSTANCE, 1 << SPI_SSN_GPIO_INDEX, 1 << SPI_SSN_GPIO_INDEX);
  423. }
  424. /**
  425. * @brief
  426. * @param
  427. * @return
  428. */
  429. void SPI_CS_Low(void)
  430. {
  431. GPIO_PinWrite(SPI_SSN_GPIO_INSTANCE, 1 << SPI_SSN_GPIO_INDEX, 0);
  432. }
  433. #ifdef SPI_ANALOG
  434. /**
  435. * @brief
  436. * @param
  437. * @return
  438. */
  439. void SPI_Clk_High(void)
  440. {
  441. GPIO_PinWrite(SPI_CLK_GPIO_INSTANCE, 1<<SPI_CLK_GPIO_INDEX,1<<SPI_CLK_GPIO_INDEX);
  442. }
  443. /**
  444. * @brief
  445. * @param
  446. * @return
  447. */
  448. void SPI_Clk_Low(void)
  449. {
  450. GPIO_PinWrite(SPI_CLK_GPIO_INSTANCE, 1<<SPI_CLK_GPIO_INDEX,0);
  451. }
  452. /**
  453. * @brief
  454. * @param
  455. * @return
  456. */
  457. void SPI_Mosi_High(void)
  458. {
  459. GPIO_PinWrite(SPI_MOSI_GPIO_INSTANCE, 1<<SPI_MOSI_GPIO_INDEX,1<<SPI_MOSI_GPIO_INDEX);
  460. }
  461. /**
  462. * @brief
  463. * @param
  464. * @return
  465. */
  466. void SPI_Mosi_Low(void)
  467. {
  468. GPIO_PinWrite(SPI_MOSI_GPIO_INSTANCE, 1<<SPI_MOSI_GPIO_INDEX,0);
  469. }
  470. /**
  471. * @brief
  472. * @param
  473. * @return
  474. */
  475. UINT8 SPI_MISO_Read(void)
  476. {
  477. return GPIO_PinRead(SPI_MISO_GPIO_INSTANCE,SPI_MISO_GPIO_INDEX);
  478. }
  479. #endif
  480. /**
  481. * @brief Software SPI_Flash bus driver basic function, send a single byte to MOSI,
  482. * and accept MISO data at the same time.
  483. * @param[in] u8Data:Data sent on the MOSI data line
  484. * @return u8Out: Data received on the MISO data line
  485. */
  486. UINT8 SPI_Write_Byte(UINT8 u8Data)
  487. {
  488. UINT8 data = u8Data;
  489. #ifdef SPI_ANALOG
  490. UINT8 i=0;
  491. for(i=0;i<8;i++){
  492. SPI_Clk_Low();
  493. if((u8Data<<i)&0x80)
  494. SPI_Mosi_High();
  495. else
  496. SPI_Mosi_Low();
  497. SPI_Clk_High();
  498. }
  499. SPI_Clk_Low();
  500. #else
  501. spiMasterDrv->Transfer(&u8Data,&data,1);
  502. #endif
  503. return 0;
  504. }
  505. #ifdef SPI_ANALOG
  506. /**
  507. * @brief
  508. * @param
  509. * @return
  510. */
  511. UINT8 SPI_Read_Byte(void)
  512. {
  513. UINT8 i=0;
  514. UINT8 rByte=0;
  515. SPI_Clk_Low();
  516. for(i=0;i<8;i++){
  517. SPI_Clk_High();
  518. rByte<<=1;
  519. rByte |= SPI_MISO_Read();
  520. SPI_Clk_Low();
  521. }
  522. return rByte;
  523. }
  524. #endif
  525. /**
  526. \fn INT32 CAN_ReadReg(UINT8 addr)
  527. \param[in] addr CAN register addr
  528. \brief write can register
  529. \return
  530. */
  531. INT32 CAN_WriteReg(UINT8 addr, UINT8 value)
  532. {
  533. SPI_CS_Low();
  534. SPI_Write_Byte(CAN_WRITE);
  535. SPI_Write_Byte(addr);
  536. SPI_Write_Byte(value);
  537. SPI_CS_High();
  538. return 0;
  539. }
  540. /**
  541. \fn INT32 CAN_ReadReg(UINT8 reg, UINT8 len, UINT8 *buf)
  542. \param[in] reg: can register addr
  543. \brief read can register
  544. \return
  545. */
  546. INT32 CAN_ReadReg(UINT8 reg, UINT8 len, UINT8 *buf)
  547. {
  548. UINT8 i =0;
  549. UINT8 data=0;
  550. INT32 res;
  551. if(buf == NULL) return -1;
  552. SPI_CS_Low();
  553. SPI_Write_Byte(CAN_READ);
  554. SPI_Write_Byte(reg);
  555. #ifdef SPI_ANALOG
  556. for(i=0;i<len;i++){
  557. buf[i]= SPI_Read_Byte();
  558. }
  559. #else
  560. for(i=0;i<len;i++){
  561. spiMasterDrv->Transfer(&data,&buf[i],1);
  562. }
  563. #endif
  564. SPI_CS_High();
  565. return i;
  566. }
  567. /**
  568. \fn UINT8 CanTriggerEvtInit(void)
  569. \param[in]
  570. \brief generate irq,then notify app
  571. \return 1 fail; 0 ok;
  572. */
  573. UINT8 CanTriggerEvtInit(void)
  574. {
  575. /*for msg queue create*/
  576. osMessageQueueAttr_t queue_attr;
  577. memset(&queue_attr, 0, sizeof(queue_attr));
  578. queue_attr.cb_mem = &can_recv_queue_cb;
  579. queue_attr.cb_size = sizeof(can_recv_queue_cb);
  580. queue_attr.mq_mem = can_recv_queue_buf;
  581. queue_attr.mq_size = sizeof(can_recv_queue_buf);
  582. can_recv_msgqueue = osMessageQueueNew(I2C_RECV_QUEUE_BUF_SIZE,1, &queue_attr);
  583. //printf("CanTriggerEvtInit \r\n");
  584. return 0;
  585. }
  586. /**
  587. \fn void CanWaitEvt(UINT32 timeout)
  588. \param[in]
  589. \brief
  590. \return
  591. */
  592. void CanWaitEvt(UINT32 timeout)
  593. {
  594. osStatus_t status;
  595. UINT8 msg = 0;
  596. UINT32 mask;
  597. status = osMessageQueueGet(can_recv_msgqueue, &msg, 0 , osWaitForever);
  598. //printf("msg = %#x\r\n",msg);
  599. }
  600. /**
  601. \fn void CanTiggerEvt(UINT8 cmd)
  602. \param[in]
  603. \brief
  604. \return
  605. */
  606. void CanTiggerEvt(UINT8 cmd)
  607. {
  608. osStatus_t status;
  609. UINT8 msg = cmd;
  610. status = osMessageQueuePut(can_recv_msgqueue, &msg, 0, 0);
  611. }
  612. /*******************************************************************************
  613. * o����y?? : MCP2515_Reset
  614. * ?����? : ����?��?��????��?����?t?��??MCP2515
  615. * ��?��? : ?T
  616. * ��?3? : ?T
  617. * ����???�� : ?T
  618. * ?��?�� : ???��2???��??��?��???a������?���䨬?,2��???��?t����?��?a?????�꨺?
  619. *******************************************************************************/
  620. INT32 HAL_Can_Reset(void)
  621. {
  622. SPI_CS_Low();
  623. SPI_Write_Byte(CAN_RESET);
  624. SPI_CS_High();
  625. return 0;
  626. }
  627. /*******************************************************************************
  628. * o����y?? : MCP2515_Init
  629. * ?����? : MCP25153?��??��????
  630. * ��?��? : ?T
  631. * ��?3? : ?T
  632. * ����???�� : ?T
  633. * ?��?�� : 3?��??���㨹������o����?t?��???��1�����2����??������???�������?��??��1?????�̨�?��
  634. *******************************************************************************/
  635. void HAL_Can_Init(Can_InitType param)
  636. {
  637. UINT8 temp=0,temp1=0;
  638. INT32 res = -1;
  639. HAL_Can_Reset(); //����?��?��????��?����?t?��??MCP2515
  640. osDelay(100/portTICK_PERIOD_MS);
  641. CAN_WriteReg(CANCTRL,OPMODE_CONFIG |CLKOUT_ENABLED);
  642. CAN_ReadReg(CANCTRL,1,&temp);//?����?CAN���䨬???��??�¦�??��
  643. // #ifdef USING_PRINTF
  644. // printf("[%d] CANCTRL = %#x \r\n",__LINE__,temp);
  645. // #endif
  646. CAN_WriteReg(CNF1,param.baudrate);
  647. CAN_WriteReg(CNF2,0x80|PHSEG1_3TQ|PRSEG_1TQ);
  648. CAN_WriteReg(CNF3,PHSEG2_3TQ);
  649. if(param.packType == STD_PACK){
  650. /*?����???2��??��??��*/
  651. CAN_WriteReg(TXB0SIDH,0xFF&(param.TxStdIDH));//����?��?o3??��0������?������?��?????
  652. CAN_WriteReg(TXB0SIDL,0xE0&(param.TxStdIDL));//����?��?o3??��0������?������?��?�̨�??
  653. CAN_WriteReg(RXM0SIDH,0xFF);
  654. CAN_WriteReg(RXM0SIDL,0xE0);
  655. CAN_WriteReg(RXM1SIDH,0xFF);
  656. CAN_WriteReg(RXM1SIDL,0xE0);
  657. /*?����???2��??��??��*/
  658. CAN_WriteReg(RXF0SIDH,0xFF&(param.RxStdIDH[0]));
  659. CAN_WriteReg(RXF0SIDL,0xE0&(param.RxStdIDL[0]));
  660. CAN_WriteReg(RXF1SIDH,0xFF&(param.RxStdIDH[1]));
  661. CAN_WriteReg(RXF1SIDL,0xE0&(param.RxStdIDL[1]));
  662. #if 0
  663. CAN_WriteReg(RXF2SIDH,0x00);
  664. CAN_WriteReg(RXF2SIDL,0xa0);
  665. CAN_WriteReg(RXF3SIDH,0x00);
  666. CAN_WriteReg(RXF3SIDL,0x40);
  667. CAN_WriteReg(RXF4SIDH,0x00);
  668. CAN_WriteReg(RXF4SIDL,0x60);
  669. CAN_WriteReg(RXF5SIDH,0x00);
  670. CAN_WriteReg(RXF5SIDL,0x80);
  671. #else
  672. CAN_WriteReg(RXF2SIDH,0xFF&(param.RxStdIDH[2]));
  673. CAN_WriteReg(RXF2SIDL,0xE0&(param.RxStdIDL[2]));
  674. CAN_WriteReg(RXF3SIDH,0xFF&(param.RxStdIDH[3]));
  675. CAN_WriteReg(RXF3SIDL,0xE0&(param.RxStdIDL[3]));
  676. CAN_WriteReg(RXF4SIDH,0xFF&(param.RxStdIDH[4]));
  677. CAN_WriteReg(RXF4SIDL,0xE0&(param.RxStdIDL[4]));
  678. CAN_WriteReg(RXF5SIDH,0xFF&(param.RxStdIDH[5]));
  679. CAN_WriteReg(RXF5SIDL,0xE0&(param.RxStdIDL[5]));
  680. #endif
  681. CAN_WriteReg(RXB0CTRL,RXM_VALID_STD);
  682. CAN_WriteReg(RXB0DLC,DLC_8);
  683. CAN_WriteReg(RXB1CTRL,RXM_VALID_STD|FILHIT1_FLTR_2);
  684. CAN_WriteReg(RXB1DLC,DLC_8);
  685. }
  686. else if(param.packType == EXT_PACK)
  687. {
  688. /*TXB0*/
  689. CAN_WriteReg(TXB0SIDH,0xFF&(param.TxStdIDH));
  690. CAN_WriteReg(TXB0SIDL,(0xEB&(param.TxStdIDL))|0x08);
  691. CAN_WriteReg(TXB0EID8,0xFF&(param.TxExtIDH));
  692. CAN_WriteReg(TXB0EID0,0xFF&(param.TxExtIDL));
  693. /*?����???2��??��??��*/
  694. CAN_WriteReg(RXM0SIDH,0xFF);
  695. CAN_WriteReg(RXM0SIDL,0xE3);
  696. CAN_WriteReg(RXM0EID8,0xFF);
  697. CAN_WriteReg(RXM0EID0,0xFF);
  698. /*?����???2��??��??��*/
  699. CAN_WriteReg(RXF0SIDH,0xFF&(param.RxStdIDH[0]));
  700. CAN_WriteReg(RXF0SIDL,(0xEB&(param.RxStdIDL[0]))|0x08);
  701. CAN_WriteReg(RXF0EID8,0xFF&(param.RxExtIDH[0]));
  702. CAN_WriteReg(RXF0EID8,0xFF&(param.RxExtIDL[0]));
  703. CAN_WriteReg(RXF1SIDH,0xFF&(param.RxStdIDH[1]));
  704. CAN_WriteReg(RXF1SIDL,(0xEB&(param.RxStdIDL[1]))|0x08);
  705. CAN_WriteReg(RXF1EID8,0xFF&(param.RxExtIDH[1]));
  706. CAN_WriteReg(RXF1EID8,0xFF&(param.RxExtIDL[1]));
  707. CAN_WriteReg(RXF2SIDH,0xFF&(param.RxStdIDH[2]));
  708. CAN_WriteReg(RXF2SIDL,(0xEB&(param.RxStdIDL[2]))|0x08);
  709. CAN_WriteReg(RXF2EID8,0xFF&(param.RxExtIDH[2]));
  710. CAN_WriteReg(RXF2EID8,0xFF&(param.RxExtIDL[2]));
  711. CAN_WriteReg(RXF3SIDH,0xFF&(param.RxStdIDH[3]));
  712. CAN_WriteReg(RXF3SIDL,(0xEB&(param.RxStdIDL[3]))|0x08);
  713. CAN_WriteReg(RXF3EID8,0xFF&(param.RxExtIDH[3]));
  714. CAN_WriteReg(RXF3EID8,0xFF&(param.RxExtIDL[3]));
  715. CAN_WriteReg(RXF4SIDH,0xFF&(param.RxStdIDH[4]));
  716. CAN_WriteReg(RXF4SIDL,(0xEB&(param.RxStdIDL[4]))|0x08);
  717. CAN_WriteReg(RXF4EID8,0xFF&(param.RxExtIDH[4]));
  718. CAN_WriteReg(RXF4EID8,0xFF&(param.RxExtIDL[4]));
  719. CAN_WriteReg(RXF5SIDH,0xFF&(param.RxStdIDH[5]));
  720. CAN_WriteReg(RXF5SIDL,(0xEB&(param.RxStdIDL[5]))|0x08);
  721. CAN_WriteReg(RXF5EID8,0xFF&(param.RxExtIDH[5]));
  722. CAN_WriteReg(RXF5EID8,0xFF&(param.RxExtIDL[5]));
  723. CAN_WriteReg(RXB0CTRL,RXM_VALID_EXT);
  724. CAN_WriteReg(RXB0DLC,DLC_8);
  725. CAN_WriteReg(RXB1CTRL,RXM_VALID_EXT|FILHIT1_FLTR_2);
  726. CAN_WriteReg(RXB1DLC,DLC_8);
  727. }
  728. CAN_WriteReg(CANINTE,0x43);
  729. CAN_WriteReg(CANINTF,0x00);
  730. CAN_WriteReg(CANCTRL,param.mode |CLKOUT_ENABLED);//??MCP2515¨¦¨¨???a?y3¡ê?¡ê¨º?,¨ª?3??????¡ê¨º? REQOP_NORMAL|CLKOUT_ENABLED
  731. CAN_ReadReg(CANSTAT,1,&temp);//?¨¢¨¨?CAN¡Á¡ä¨¬???¡ä??¡Â¦Ì??¦Ì
  732. if(param.mode !=(temp&0xE0))//?D??MCP2515¨º?¡¤?¨°??-??¨¨??y3¡ê?¡ê¨º?
  733. {
  734. CAN_WriteReg(CANCTRL,param.mode|CLKOUT_ENABLED);//?����???MCP2515����???a?y3��?�꨺?,��?3??????�꨺?REQOP_NORMAL
  735. }
  736. }
  737. /*******************************************************************************
  738. * : HAL_Can_Sleep
  739. *
  740. *
  741. *
  742. *
  743. *
  744. *******************************************************************************/
  745. void HAL_Can_Sleep(void)
  746. {
  747. UINT8 temp=0,t=0;
  748. do{
  749. CAN_WriteReg(CANCTRL,OPMODE_SLEEP |CLKOUT_DISABLED);
  750. CAN_ReadReg(CANSTAT,1,&temp);
  751. #ifdef USING_PRINTF
  752. //printf("%s[%d] [%#x]\r\n",__FUNCTION__, __LINE__,temp);
  753. #endif
  754. if(OPMODE_SLEEP ==(temp&0xE0)){
  755. #ifdef USING_PRINTF
  756. //printf("SLEEP SUC \r\n");
  757. #endif
  758. break;
  759. }
  760. }while(t++<3);
  761. }
  762. /*******************************************************************************
  763. * o¡¥¨ºy?? : HAL_Can_Transmit
  764. * ?¨¨¨º? : CAN¡¤¡é?¨ª???¡§3¡è?¨¨¦Ì?¨ºy?Y
  765. * ¨º?¨¨? : *CAN_TX_Buf(¡äy¡¤¡é?¨ª¨ºy?Y?o3???????),len(¡äy¡¤¡é?¨ª¨ºy?Y3¡è?¨¨)
  766. * ¨º?3? : ?T
  767. * ¡¤¦Ì???¦Ì : ?T
  768. * ?¦Ì?¡Â : ?T
  769. *******************************************************************************/
  770. INT32 HAL_Can_Transmit(Can_TxMsgType Can_TxMsg)
  771. {
  772. UINT8 tryTim,count,value,i;
  773. count=0;
  774. while(count<Can_TxMsg.DLC)
  775. {
  776. tryTim=0;
  777. CAN_ReadReg(TXB0CTRL,1,&value);
  778. while((value&0x08) && (tryTim<50))//?��?��?��?3D?���䨬???��?,�̨���yTXREQ����????��?
  779. {
  780. CAN_ReadReg(TXB0CTRL,1,&value);
  781. osDelay(1/portTICK_PERIOD_MS);
  782. tryTim++;
  783. }
  784. /*TXB0*/
  785. CAN_WriteReg(TXB0SIDH,0xFF&(Can_TxMsg.stdIDH));//����?��?o3??��0������?������?��?????
  786. CAN_WriteReg(TXB0SIDL,0xE0&(Can_TxMsg.stdIDL));//����?��?o3??��0������?������?��?�̨�??
  787. for(i=0;i<8;)
  788. {
  789. CAN_WriteReg(TXB0D0+i,Can_TxMsg.Data[count++]);//??��y����?����?��y?YD�䨨?����?��?o3???��??��
  790. i++;
  791. if(count>=Can_TxMsg.DLC) break;
  792. }
  793. CAN_WriteReg(TXB0DLC,i);//??��???��y����?����?��y?Y3��?��D�䨨?����?��?o3??��0��?����?��3��?��??��??��
  794. SPI_CS_Low();
  795. CAN_WriteReg(TXB0CTRL,0x08);//???������?������??
  796. SPI_CS_High();
  797. }
  798. }
  799. /*******************************************************************************
  800. * o����y?? : HAL_Can_Receive(UINT8 *CAN_RX_Buf)
  801. * ?����? : CAN?����?��???��y?Y
  802. * ��?��? : *CAN_TX_Buf(��y?����?��y?Y?o3???????)
  803. * ��?3? : ?T
  804. * ����???�� : len(?����?��?��y?Y��?3��?��,0~8��??��)
  805. * ?��?�� : ?T
  806. *******************************************************************************/
  807. UINT8 HAL_Can_Receive(UINT8 *CAN_RX_Buf)
  808. {
  809. UINT8 i=0,len=0,temp=0;
  810. CAN_ReadReg(CANINTF,1,&temp);
  811. if(temp & 0x01)
  812. {
  813. CAN_ReadReg(RXB0DLC,1,&len);
  814. while(i<len)
  815. {
  816. CAN_ReadReg(RXB0D0+i,1,&CAN_RX_Buf[i]);
  817. i++;
  818. }
  819. }else if(temp & 0x02){
  820. CAN_ReadReg(RXB1DLC,1,&len);
  821. while(i<len)
  822. {
  823. CAN_ReadReg(RXB1D0+i,1,&CAN_RX_Buf[i]);
  824. i++;
  825. }
  826. }
  827. CAN_WriteReg(CANINTF,0);
  828. return len;
  829. }
  830. /**
  831. \fn void CanHandleDataCallback(UINT32 event)
  832. \param[in] event spi irq event
  833. \brief base on event,handle different situation
  834. \return
  835. */
  836. void CanHandleDataCallback(UINT32 event)
  837. {
  838. if(event & ARM_SPI_EVENT_TRANSFER_COMPLETE)
  839. {
  840. }
  841. else if(event & ARM_SPI_EVENT_DATA_LOST)
  842. {
  843. }
  844. else if(event & ARM_SPI_EVENT_MODE_FAULT)
  845. {
  846. }
  847. #if 0
  848. #ifdef USING_PRINTF
  849. //printf("[%d] CanHandleDataCallback :%d\r\n",__LINE__,event);
  850. #else
  851. ECOMM_TRACE(UNILOG_PLA_APP,CAN_CB1, P_INFO, 1, "SPI event [%u] coming!",event);
  852. #endif
  853. #endif
  854. }
  855. /**
  856. \fn void CanSPIHandler(ARM_SPI_SignalEvent_t cb_event)
  857. \param[in] cb_event :
  858. \brief init spi module
  859. \return
  860. */
  861. void CanSPIHandler(ARM_SPI_SignalEvent_t cb_event,UINT8 mode,UINT8 dataBits, UINT32 spiRate )
  862. {
  863. #ifdef SPI_ANALOG
  864. gpio_pin_config_t nGpioCfg={0};
  865. nGpioCfg.pinDirection = GPIO_DirectionOutput;
  866. nGpioCfg.misc.initOutput = 1;
  867. pad_config_t padConfig;
  868. PAD_GetDefaultConfig(&padConfig);
  869. /*cs*/
  870. padConfig.mux = PAD_MuxAlt0;
  871. PAD_SetPinConfig(SPI_SSN_GPIO_PAD_ADDR, &padConfig);
  872. PAD_SetPinPullConfig(SPI_SSN_GPIO_PAD_ADDR, PAD_InternalPullDown);
  873. GPIO_PinConfig(SPI_SSN_GPIO_INSTANCE, SPI_SSN_GPIO_INDEX, &nGpioCfg);
  874. GPIO_PinWrite(SPI_SSN_GPIO_INSTANCE, 1<<SPI_SSN_GPIO_INDEX,0);
  875. /*
  876. clk
  877. */
  878. padConfig.mux = PAD_MuxAlt0;
  879. PAD_SetPinConfig(SPI_CLK_GPIO_PAD_ADDR, &padConfig);
  880. PAD_SetPinPullConfig(SPI_CLK_GPIO_PAD_ADDR, PAD_InternalPullDown);
  881. GPIO_PinConfig(SPI_CLK_GPIO_INSTANCE, SPI_CLK_GPIO_INDEX, &nGpioCfg);
  882. GPIO_PinWrite(SPI_CLK_GPIO_INSTANCE, 1<<SPI_CLK_GPIO_INDEX,0);
  883. /*mosi*/
  884. padConfig.mux = PAD_MuxAlt0;
  885. PAD_SetPinConfig(SPI_MOSI_GPIO_PAD_ADDR, &padConfig);
  886. PAD_SetPinPullConfig(SPI_MOSI_GPIO_PAD_ADDR, PAD_InternalPullDown);
  887. GPIO_PinConfig(SPI_MOSI_GPIO_INSTANCE, SPI_MOSI_GPIO_INDEX, &nGpioCfg);
  888. GPIO_PinWrite(SPI_MOSI_GPIO_INSTANCE, 1<<SPI_MOSI_GPIO_INDEX,0);
  889. /*miso*/
  890. nGpioCfg.pinDirection = GPIO_DirectionInput;
  891. nGpioCfg.misc.initOutput = 0;
  892. padConfig.mux = PAD_MuxAlt0;
  893. padConfig.pullSelect = PAD_PullInternal;
  894. padConfig.pullUpEnable = PAD_PullUpDisable;
  895. padConfig.pullDownEnable = PAD_PullDownEnable;
  896. PAD_SetPinConfig(SPI_MISO_GPIO_PAD_ADDR, &padConfig);
  897. GPIO_PinConfig(SPI_MISO_GPIO_INSTANCE, SPI_MISO_GPIO_INDEX, &nGpioCfg);
  898. #else
  899. // Initialize master spi
  900. spiMasterDrv->Initialize(NULL);
  901. // Power on
  902. spiMasterDrv->PowerControl(ARM_POWER_FULL);
  903. // Configure slave spi bus
  904. spiMasterDrv->Control(ARM_SPI_MODE_MASTER | mode | ARM_SPI_DATA_BITS(dataBits) |ARM_SPI_MSB_LSB | ARM_SPI_SS_MASTER_SW, spiRate);
  905. #endif
  906. }
  907. /**
  908. \fn INT32 ZM01RecvParam(UINT8 *param)
  909. \param[in]
  910. \brief read ZM01 register
  911. \return execution_status
  912. */
  913. INT32 ZM01RecvParam(UINT8 *param)
  914. {
  915. INT32 res = 0;
  916. UINT8 tempBuffer = 0xaa;
  917. if(param == NULL) return -7;
  918. res = i2cDrvInstance->MasterTransmit(ZM01_DEVICE_ADDR, &tempBuffer, 1, true);
  919. res = i2cDrvInstance->MasterReceive(ZM01_DEVICE_ADDR, param, 1, true);
  920. return res;
  921. }
  922. /**
  923. \fn INT32 GSENSOR_WriteReg(UINT8 addr, UINT8 value)
  924. \param[in] addr GSENSOR register addr
  925. \brief Write to GSENSOR register
  926. \return
  927. */
  928. INT32 GSENSOR_WriteReg(UINT8 addr, UINT8 value)
  929. {
  930. UINT8 tempBuffer[2];
  931. INT32 res = -1;
  932. tempBuffer[0] = addr;
  933. tempBuffer[1] = value;
  934. return (i2cDrvInstance->MasterTransmit(GSENSOR_DEVICE_ADDR, tempBuffer, sizeof(tempBuffer), true));
  935. }
  936. /**
  937. \fn INT32 GSENSOR_ReadReg(UINT8 reg, UINT8 len, UINT8 *buf)
  938. \param[in] addr GSENSOR register addr
  939. \brief read GSENSOR register
  940. \return register value of GSENSOR
  941. */
  942. INT32 GSENSOR_ReadReg(UINT8 reg, UINT8 len, UINT8 *buf)
  943. {
  944. INT32 res = -1;
  945. if(len > 8 || buf == NULL) return -1;
  946. res = i2cDrvInstance->MasterTransmit(GSENSOR_DEVICE_ADDR, &reg, 1, true);
  947. res = i2cDrvInstance->MasterReceive(GSENSOR_DEVICE_ADDR, buf, len, true);
  948. return res;
  949. }
  950. /**
  951. \fn void GsensorI2CCallback(UINT32 event)
  952. \param[in] event : i2c irq event
  953. \brief i2c irq event ,callback function
  954. \return
  955. */
  956. void GsensorI2CCallback(UINT32 event)
  957. {
  958. switch(event)
  959. {
  960. case ARM_I2C_EVENT_TRANSFER_DONE:
  961. break;
  962. case ARM_I2C_EVENT_TRANSFER_INCOMPLETE:
  963. break;
  964. case ARM_I2C_EVENT_ADDRESS_NACK:
  965. break;
  966. case ARM_I2C_EVENT_BUS_ERROR:
  967. break;
  968. case ARM_I2C_EVENT_BUS_CLEAR:
  969. break;
  970. default:
  971. break;
  972. }
  973. }
  974. /**
  975. \fn void HAL_I2C_CreateRecvTaskAndQueue(uint32_t event)
  976. \param[in]
  977. \brief RECV data
  978. \return
  979. */
  980. void HAL_I2C_RecvControl(bool on)
  981. {
  982. EC_ASSERT(g_i2CRecvFlag, g_i2CRecvFlag, 0, 0);
  983. if(on == true)
  984. {
  985. osEventFlagsClear(g_i2CRecvFlag, I2C_RECV_CONTROL_FLAG);
  986. }
  987. else
  988. {
  989. osEventFlagsSet(g_i2CRecvFlag, I2C_RECV_CONTROL_FLAG);
  990. }
  991. }
  992. void GsensorTriggerEvent(UINT32 event ,UINT32 data)
  993. {
  994. osStatus_t status;
  995. i2c_recv_msgqueue_obj_t msg={0};
  996. msg.event = event;
  997. msg.value = data;
  998. status = osMessageQueuePut(i2c_recv_msgqueue, &msg, 0, 0);
  999. if(status == osErrorResource)
  1000. {
  1001. ECOMM_TRACE(UNILOG_PLA_DRIVER, GsensorTriggerEvent_0, P_WARNING, 0, "I2C recv queue error");
  1002. }
  1003. }
  1004. static INT32 I2CEvtProcess(uint32_t evt)
  1005. {
  1006. INT32 ret;
  1007. #if SL_SC7A20_16BIT_8BIT
  1008. INT16 xyzData[7];
  1009. #else
  1010. INT8 xyzData[7];
  1011. #endif
  1012. HAL_I2C_RecvControl(true);
  1013. if(evt & I2C_INT1_REQ_BITMAP)
  1014. {
  1015. }
  1016. if(evt & I2C_INT2_REQ_BITMAP)
  1017. {
  1018. SL_SC7A20_Read_XYZ_Data(xyzData);
  1019. }
  1020. return 0;
  1021. }
  1022. static void HAL_I2C_RecvTaskEntry(void)
  1023. {
  1024. while(1)
  1025. {
  1026. uint32_t flag,mask;
  1027. osStatus_t status;
  1028. i2c_recv_msgqueue_obj_t msg;
  1029. flag = osEventFlagsWait(g_i2CRecvFlag, I2C_RECV_CONTROL_FLAG, osFlagsNoClear | osFlagsWaitAll, osWaitForever);
  1030. EC_ASSERT(flag == I2C_RECV_CONTROL_FLAG, flag, 0, 0);
  1031. status = osMessageQueueGet(i2c_recv_msgqueue, &msg, 0 , osWaitForever);
  1032. if(status == osOK)
  1033. {
  1034. mask = SaveAndSetIRQMask();
  1035. //handle data
  1036. //I2CEvtProcess(msg.event);
  1037. #ifdef USING_PRINTF
  1038. //printf("[%d]i2c recv event\r\n",__LINE__);
  1039. #else
  1040. ECOMM_TRACE(UNILOG_PLA_DRIVER, I2C_GSENSOR_D, P_INFO, 0, "i2c recv event");
  1041. #endif
  1042. RestoreIRQMask(mask);
  1043. }
  1044. }
  1045. }
  1046. static void HAL_I2C_CreateRecvTaskAndQueue(void)
  1047. {
  1048. if(g_halI2CInitFlag & HAL_I2C_RECV_TASK_QUEUE_CREATED)
  1049. {
  1050. return;
  1051. }
  1052. /*
  1053. for task create
  1054. */
  1055. osThreadId_t threadId;
  1056. osThreadAttr_t task_attr;
  1057. /*for msg queue create*/
  1058. osMessageQueueAttr_t queue_attr;
  1059. g_i2CRecvFlag = osEventFlagsNew(NULL);
  1060. EC_ASSERT(g_i2CRecvFlag, g_i2CRecvFlag, 0, 0);
  1061. memset(&queue_attr, 0, sizeof(queue_attr));
  1062. queue_attr.cb_mem = &i2c_recv_queue_cb;
  1063. queue_attr.cb_size = sizeof(i2c_recv_queue_cb);
  1064. queue_attr.mq_mem = i2c_recv_queue_buf;
  1065. queue_attr.mq_size = sizeof(i2c_recv_queue_buf);
  1066. i2c_recv_msgqueue = osMessageQueueNew(I2C_RECV_QUEUE_BUF_SIZE,sizeof(i2c_recv_msgqueue_obj_t), &queue_attr);
  1067. EC_ASSERT(i2c_recv_msgqueue, i2c_recv_msgqueue, 0, 0);
  1068. memset(& task_attr, 0, sizeof(task_attr));
  1069. memset(i2c_recv_task_stack, 0xA5, I2C_RECV_TASK_STACK_SIZE);
  1070. task_attr.name = "GsensorRecv";
  1071. task_attr.stack_size = I2C_RECV_TASK_STACK_SIZE;
  1072. task_attr.stack_mem = i2c_recv_task_stack;
  1073. task_attr.priority = osPriorityNormal;
  1074. task_attr.cb_mem = &i2c_recv_task;
  1075. task_attr.cb_size = sizeof(StaticTask_t);
  1076. threadId = osThreadNew(HAL_I2C_RecvTaskEntry, NULL, &task_attr);
  1077. EC_ASSERT(threadId, threadId, 0, 0);
  1078. g_halI2CInitFlag |= HAL_I2C_RECV_TASK_QUEUE_CREATED;
  1079. }
  1080. /**
  1081. \fn void GsensorI2CCallback(uint32_t event)
  1082. \param[in] event : i2c irq event
  1083. \brief i2c irq event ,callback function
  1084. \return
  1085. */
  1086. void GsensorI2CHandler(ARM_I2C_SignalEvent_t cb_event)
  1087. {
  1088. // Initialize with callback
  1089. i2cDrvInstance->Initialize(cb_event);
  1090. // Power on
  1091. i2cDrvInstance->PowerControl(ARM_POWER_FULL);
  1092. // Configure I2C bus
  1093. i2cDrvInstance->Control(ARM_I2C_BUS_SPEED, ARM_I2C_BUS_SPEED_STANDARD);
  1094. i2cDrvInstance->Control(ARM_I2C_BUS_CLEAR, 0);
  1095. HAL_I2C_CreateRecvTaskAndQueue();
  1096. #ifdef USING_PRINTF
  1097. //printf("[%d] i2c config ok\r\n",__LINE__);
  1098. #else
  1099. ECOMM_TRACE(UNILOG_PLA_DRIVER, I2C_GSENSOR_I, P_INFO, 0, "i2c config ok");
  1100. #endif
  1101. }
  1102. /**
  1103. \fn void GPSSendStr(uint8_t* strPtr, uint16_t strLen)
  1104. \param[in] strPtr for gps usart port;
  1105. \brief
  1106. \return
  1107. */
  1108. void GPSSendStr(uint8_t* strPtr, uint16_t strLen)
  1109. {
  1110. HAL_UART_SendStr(PORT_USART_2,strPtr,strLen);
  1111. }
  1112. /**
  1113. \fn void GpsDataRecvCallback(uint32_t event, void* dataPtr, uint32_t dataLen)
  1114. \param[in] event :Data receiving timeout processing and data receiving completion processing;
  1115. \ dataPtr : Point to receive data buff
  1116. \ dataLen : Received data length
  1117. \brief i2c irq event ,callback function
  1118. \return
  1119. */
  1120. void GpsDataRecvCallback(UINT32 event, void* dataPtr, UINT32 dataLen)
  1121. {
  1122. if((event == ARM_USART_EVENT_RX_TIMEOUT) || (event == ARM_USART_EVENT_RECEIVE_COMPLETE)){
  1123. #ifdef USING_PRINTF
  1124. // //printf("GpsDataRecvCallback [%d] %s\r\n",dataLen,dataPtr);
  1125. #endif
  1126. if(dataLen>0){
  1127. gpsReqMsg gpsInfo;
  1128. gpsInfo.dataPtr=malloc(dataLen+1);
  1129. if(gpsInfo.dataPtr){
  1130. memcpy(gpsInfo.dataPtr,dataPtr,dataLen);
  1131. gpsInfo.len=dataLen;
  1132. osMessageQueuePut(gpsMsgHandle, &gpsInfo, 0, 2000);
  1133. }
  1134. }
  1135. }
  1136. slpManStartWaitATTimer();
  1137. }
  1138. /**
  1139. \fn void GPSUsartHandler(ARM_DRIVER_USART * uartDriverHandler, uint32_t baudRate)
  1140. \param[in] baudRate for gps usart port;
  1141. \brief config gps usart port
  1142. \return
  1143. */
  1144. void GPSUsartHandler(UINT32 baudRate)
  1145. {
  1146. hal_uart_config_t halUartConfig = {0};
  1147. hal_uart_hardware_config_t hwConfig = {
  1148. ARM_POWER_FULL,
  1149. ARM_USART_MODE_ASYNCHRONOUS | ARM_USART_DATA_BITS_8 |
  1150. ARM_USART_PARITY_NONE | ARM_USART_STOP_BITS_1 |
  1151. ARM_USART_FLOW_CONTROL_NONE,
  1152. baudRate
  1153. };
  1154. halUartConfig.uartDriverHandler = usartHandle;
  1155. halUartConfig.recv_cb = GpsDataRecvCallback;
  1156. halUartConfig.recvBuffPtr = gps_uart_recv_buf;
  1157. halUartConfig.recvBuffSize = GPS_DATA_RECV_BUFFER_SIZE;
  1158. HAL_UART_InitHandler(PORT_USART_2, &halUartConfig, &hwConfig, HAL_UART_TASK_CREATE_FLAG_SEND_RECV);
  1159. HAL_UART_RecvFlowControl(false);
  1160. }
  1161. /**
  1162. \fn INT32 AdcGetRes(UINT32 NTCvalue)
  1163. \param[in] req : NTCvalue
  1164. \brief
  1165. \return Resvalue
  1166. */
  1167. static INT32 AdcGetRes(UINT32 NTCvalue){
  1168. UINT32 Resvalue;
  1169. if(NTCvalue>=(ADC_ChannelAioVbat-10))
  1170. Resvalue=1000000;
  1171. else{
  1172. Resvalue=(long long)ADC_ChannelAioRes*(long long)NTCvalue/(ADC_ChannelAioVbat-NTCvalue);
  1173. }
  1174. return Resvalue;
  1175. }
  1176. /**
  1177. \fn INT32 AdcGetRes(UINT32 NTCvalue)
  1178. \param[in] req : NTCvalue
  1179. \brief
  1180. \return Resvalue
  1181. */
  1182. static INT32 AdcGetResFromInres(UINT32 NTCvalue){
  1183. UINT32 Resvalue,ResvalueCount;
  1184. if(NTCvalue>=(ADC_ChannelAioVbat-10))
  1185. ResvalueCount=1000000;
  1186. else{
  1187. ResvalueCount=ADC_ChannelAioRes*NTCvalue/(ADC_ChannelAioVbat-NTCvalue);
  1188. }
  1189. #ifdef USING_PRINTF
  1190. //printf("%s[%d][%d][%d]\r\n",__FUNCTION__, __LINE__,ADC_InsideRES,ResvalueCount);
  1191. #endif
  1192. if(ResvalueCount>=ADC_InsideRES)
  1193. Resvalue=1000000;
  1194. else
  1195. Resvalue=(long long)ADC_InsideRES*(long long)ResvalueCount/(ADC_InsideRES-ResvalueCount);
  1196. #ifdef USING_PRINTF
  1197. //printf("%s[%d][%d]\r\n",__FUNCTION__, __LINE__,Resvalue);
  1198. #endif
  1199. return Resvalue;
  1200. }
  1201. /**
  1202. \fn INT32 AdcVbatCali(UINT32 NTCvalue)
  1203. \param[in] req : NTCvalue
  1204. \brief
  1205. \return Resvalue
  1206. */
  1207. static INT32 AdcVbatCali(UINT32 NTCvalue){
  1208. UINT32 Resvalue;
  1209. if(NTCvalue>=(ADC_ChannelAioVbat-10))
  1210. Resvalue=1000000;
  1211. else{
  1212. Resvalue=(long long)(ADC_ChannelAioRes+ADC_CALIBRATION_VALUE)*(long long)NTCvalue/ADC_CALIBRATION_VALUE; //ADC_ChannelAioRes*NTCvalue/(ADC_ChannelAioVbat-NTCvalue);
  1213. }
  1214. if(Resvalue<1300&&Resvalue>1100)
  1215. ADC_ChannelAioVbat=Resvalue;
  1216. return Resvalue;
  1217. }
  1218. /**
  1219. \fn INT32 AdcInresCali(UINT32 NTCvalue)
  1220. \param[in] req : NTCvalue
  1221. \brief
  1222. \return Resvalue
  1223. */
  1224. static INT32 AdcInresCali(UINT32 NTCvalue){
  1225. UINT32 Resvalue,ResvalueCount;
  1226. if(NTCvalue>=(ADC_ChannelAioVbat-10))
  1227. ResvalueCount=1000000;
  1228. else{
  1229. ResvalueCount=ADC_ChannelAioRes*NTCvalue/(ADC_ChannelAioVbat-NTCvalue);
  1230. }
  1231. #ifdef USING_PRINTF
  1232. //printf("%s[%d][%d]\r\n",__FUNCTION__, __LINE__,ResvalueCount);
  1233. #endif
  1234. if(ResvalueCount>=ADC_CALIBRATION_VALUE)
  1235. Resvalue=1000000;
  1236. else
  1237. Resvalue=(long long)ADC_CALIBRATION_VALUE*(long long)ResvalueCount/(ADC_CALIBRATION_VALUE-ResvalueCount);
  1238. if(Resvalue>=200000&&Resvalue<1000000)
  1239. ADC_InsideRES=Resvalue;
  1240. return Resvalue;
  1241. }
  1242. /**
  1243. \fn INT32 AdcSendReq(UINT32 req,UINT32 * param ,UINT32 timeout)
  1244. \param[in] req : ADC_REQ_BITMAP_VBAT ADC_REQ_BITMAP_TEMP; timeout = 0 at irq ,otherwize equal to ADC_MSG_TIMEOUT
  1245. \brief return bat value ,trigger deinit
  1246. \return 1 FAIL , 0 OK
  1247. */
  1248. INT32 AdcSendReq(UINT32 req,UINT32 * param , UINT8 len ,UINT32 timeout)
  1249. {
  1250. INT32 ret;
  1251. adcReqMsg ReqMsg;
  1252. ReqMsg.request = req;
  1253. ReqMsg.param[NTC_Channel1] = ReqMsg.param[NTC_Channel2] = ReqMsg.param[NTC_Channel3] = ReqMsg.param[NTC_Channel4] = ReqMsg.param[NTC_Channel5] = ReqMsg.param[NTC_Channel5_InresCali] =ADC_AioResDivRatioDefault ;
  1254. ret = osMessageQueuePut(adcMsgHandle, &ReqMsg, 0, timeout);
  1255. if(ret != osOK)
  1256. {
  1257. return ret;
  1258. }
  1259. else
  1260. {
  1261. ret = osEventFlagsWait(adcTrigerHandle, ADC_RECV_CONTROL_FLAG, osFlagsWaitAll, timeout);
  1262. //to do
  1263. switch(req)
  1264. {
  1265. case ADC_REQ_BITMAP_VBAT:
  1266. param[0] = gNtcDev.NTCvalue[0];
  1267. break;
  1268. case ADC_REQ_BITMAP_TEMP:
  1269. param[0] = gNtcDev.NTCvalue[1];
  1270. break;
  1271. case ADC_REQ_BITMAP_CH1:
  1272. param[0] = AdcGetResFromInres(gNtcDev.NTCvalue[2+NTC_Channel1]);
  1273. break;
  1274. case ADC_REQ_BITMAP_CH2:
  1275. param[0] =AdcGetResFromInres(gNtcDev.NTCvalue[2+NTC_Channel2]);
  1276. break;
  1277. case ADC_REQ_BITMAP_CH3:
  1278. param[0] =AdcGetResFromInres(gNtcDev.NTCvalue[2+NTC_Channel3]);
  1279. break;
  1280. case ADC_REQ_BITMAP_CH4:
  1281. param[0] = AdcGetRes(gNtcDev.NTCvalue[2+NTC_Channel4]);
  1282. break;
  1283. case ADC_REQ_BITMAP_CH5:
  1284. param[0] = AdcGetRes(gNtcDev.NTCvalue[2+NTC_Channel5]);
  1285. break;
  1286. case ADC_REQ_BITMAP_VBAT_CALI:
  1287. param[0] = AdcVbatCali(gNtcDev.NTCvalue[2+NTC_Channel5_VbatCali]);
  1288. break;
  1289. case ADC_REQ_BITMAP_INRES_CALI:
  1290. param[0] = AdcInresCali(gNtcDev.NTCvalue[2+NTC_Channel5_InresCali]);
  1291. break;
  1292. }
  1293. osEventFlagsClear(adcTrigerHandle, ADC_RECV_CONTROL_FLAG);
  1294. return ret;
  1295. }
  1296. }
  1297. /**
  1298. \fn static void ADC_VbatChannelCallback(uint32_t result)
  1299. \param[in]
  1300. \brief return bat value ,trigger deinit
  1301. \return
  1302. */
  1303. static void ADC_VbatChannelCallback(uint32_t result)
  1304. {
  1305. vbatChannelResult = result;
  1306. osEventFlagsSet(adcEvtHandle, ADC_REQ_BITMAP_VBAT);
  1307. }
  1308. /**
  1309. \fn static void ADC_ThermalChannelCallback(uint32_t result)
  1310. \param[in]
  1311. \brief return thermal value ,trigger deinit
  1312. \return
  1313. */
  1314. static void ADC_ThermalChannelCallback(uint32_t result)
  1315. {
  1316. thermalChannelResult = result;
  1317. osEventFlagsSet(adcEvtHandle, ADC_REQ_BITMAP_TEMP);
  1318. }
  1319. static void ADC_NTC1ChannelCallback(uint32_t result)
  1320. {
  1321. NTCChannelResult[NTC_Channel1] = result;
  1322. osEventFlagsSet(adcEvtHandle, ADC_REQ_BITMAP_CH1);
  1323. }
  1324. static void ADC_NTC2ChannelCallback(uint32_t result)
  1325. {
  1326. NTCChannelResult[NTC_Channel2] = result;
  1327. osEventFlagsSet(adcEvtHandle, ADC_REQ_BITMAP_CH2);
  1328. }
  1329. static void ADC_NTC3ChannelCallback(uint32_t result)
  1330. {
  1331. NTCChannelResult[NTC_Channel3] = result;
  1332. osEventFlagsSet(adcEvtHandle, ADC_REQ_BITMAP_CH3);
  1333. }
  1334. static void ADC_NTC4OR5ChannelCallback(uint32_t result)
  1335. {
  1336. if(gNtcDev.flagC4){
  1337. NTCChannelResult[NTC_Channel4] = result;
  1338. osEventFlagsSet(adcEvtHandle, ADC_REQ_BITMAP_CH4);
  1339. }else{
  1340. NTCChannelResult[NTC_Channel5] = result;
  1341. osEventFlagsSet(adcEvtHandle, ADC_REQ_BITMAP_CH5);
  1342. }
  1343. }
  1344. static void ADC_NTCVbatCaliChannelCallback(uint32_t result)
  1345. {
  1346. NTCChannelResult[NTC_Channel5_VbatCali] = result;
  1347. osEventFlagsSet(adcEvtHandle, ADC_REQ_BITMAP_VBAT_CALI);
  1348. }
  1349. static void ADC_NTCInresCaliChannelCallback(uint32_t result)
  1350. {
  1351. NTCChannelResult[NTC_Channel5_InresCali] = result;
  1352. osEventFlagsSet(adcEvtHandle, ADC_REQ_BITMAP_INRES_CALI);
  1353. }
  1354. /**
  1355. \fn void AdcProcess(void* arg)
  1356. \param[in]
  1357. \brief handle adc init ,deinit and convert process
  1358. \return
  1359. */
  1360. static void AdcProcess(void* arg)
  1361. {
  1362. adcReqMsg regMsg;
  1363. INT32 ret;
  1364. while(1)
  1365. {
  1366. /*
  1367. */
  1368. osMessageQueueGet(adcMsgHandle, &regMsg, 0, osWaitForever);
  1369. /*
  1370. handle event
  1371. */
  1372. adc_config_t adcConfig;
  1373. INT8 times=1;
  1374. ADC_GetDefaultConfig(&adcConfig);
  1375. osEventFlagsClear(adcEvtHandle, regMsg.request);
  1376. retry:
  1377. if(regMsg.request & ADC_REQ_BITMAP_VBAT)
  1378. {
  1379. adcConfig.channelConfig.vbatResDiv = ADC_VbatResDivRatio3Over16;
  1380. ADC_ChannelInit(ADC_ChannelVbat, ADC_UserAPP, &adcConfig, ADC_VbatChannelCallback);
  1381. ADC_StartConversion(ADC_ChannelVbat, ADC_UserAPP);
  1382. }
  1383. if(regMsg.request & ADC_REQ_BITMAP_TEMP)
  1384. {
  1385. adcConfig.channelConfig.thermalInput = ADC_ThermalInputVbat;
  1386. ADC_ChannelInit(ADC_ChannelThermal, ADC_UserAPP, &adcConfig, ADC_ThermalChannelCallback);
  1387. ADC_StartConversion(ADC_ChannelThermal, ADC_UserAPP);
  1388. }
  1389. if(regMsg.request & ADC_REQ_BITMAP_CH1)
  1390. {
  1391. if(regMsg.param[NTC_Channel1]>=ADC_AioResDivRatio1 && regMsg.param[NTC_Channel1]<=ADC_AioResDivRatio1Over16){
  1392. #ifdef USING_PRINTF
  1393. //printf("%s[%d]\r\n",__FUNCTION__, __LINE__);
  1394. #endif
  1395. adcConfig.channelConfig.aioResDiv = regMsg.param[NTC_Channel1];
  1396. }else{
  1397. #ifdef USING_PRINTF
  1398. //printf("%s[%d]\r\n",__FUNCTION__, __LINE__);
  1399. #endif
  1400. adcConfig.channelConfig.aioResDiv = ADC_AioResDivRatioDefault;
  1401. }
  1402. ADC_ChannelInit(ADC_ChannelAio1, ADC_UserAPP, &adcConfig, ADC_NTC1ChannelCallback);
  1403. ADC_StartConversion(ADC_ChannelAio1, ADC_UserAPP);
  1404. }
  1405. if(regMsg.request & ADC_REQ_BITMAP_CH2)
  1406. {
  1407. if(regMsg.param[NTC_Channel2]>=ADC_AioResDivRatio1 && regMsg.param[NTC_Channel2]<=ADC_AioResDivRatio1Over16){
  1408. #ifdef USING_PRINTF
  1409. //printf("%s[%d]\r\n",__FUNCTION__, __LINE__);
  1410. #endif
  1411. adcConfig.channelConfig.aioResDiv = regMsg.param[NTC_Channel2];
  1412. }else{
  1413. #ifdef USING_PRINTF
  1414. //printf("%s[%d]\r\n",__FUNCTION__, __LINE__);
  1415. #endif
  1416. }
  1417. ADC_ChannelInit(ADC_ChannelAio2, ADC_UserAPP, &adcConfig, ADC_NTC2ChannelCallback);
  1418. ADC_StartConversion(ADC_ChannelAio2, ADC_UserAPP);
  1419. }
  1420. if(regMsg.request & ADC_REQ_BITMAP_CH3)
  1421. {
  1422. if(regMsg.param[NTC_Channel3]>=ADC_AioResDivRatio1 && regMsg.param[NTC_Channel3]<=ADC_AioResDivRatio1Over16){
  1423. #ifdef USING_PRINTF
  1424. //printf("%s[%d]\r\n",__FUNCTION__, __LINE__);
  1425. #endif
  1426. adcConfig.channelConfig.aioResDiv = regMsg.param[NTC_Channel3];
  1427. }else{
  1428. #ifdef USING_PRINTF
  1429. //printf("%s[%d]\r\n",__FUNCTION__, __LINE__);
  1430. #endif
  1431. adcConfig.channelConfig.aioResDiv = ADC_AioResDivRatioDefault;
  1432. }
  1433. ADC_ChannelInit(ADC_ChannelAio3, ADC_UserAPP, &adcConfig, ADC_NTC3ChannelCallback);
  1434. ADC_StartConversion(ADC_ChannelAio3, ADC_UserAPP);
  1435. }
  1436. if(regMsg.request & ADC_REQ_BITMAP_CH4 ||regMsg.request & ADC_REQ_BITMAP_CH5)
  1437. {
  1438. if(regMsg.request & ADC_REQ_BITMAP_CH4){
  1439. gNtcDev.flagC4 = 1;
  1440. GPIO_PinWrite(0, 1, 1);
  1441. }else{
  1442. GPIO_PinWrite(0, 1, 0);
  1443. gNtcDev.flagC4 = 0;
  1444. }
  1445. ADC_GetDefaultConfig(&adcConfig);
  1446. adcConfig.channelConfig.thermalInput = ADC_ThermalInputAio4;
  1447. ADC_ChannelInit(ADC_ChannelThermal, ADC_UserAPP, &adcConfig, ADC_NTC4OR5ChannelCallback);
  1448. ADC_StartConversion(ADC_ChannelThermal, ADC_UserAPP);
  1449. }
  1450. if(regMsg.request & ADC_REQ_BITMAP_VBAT_CALI)
  1451. {
  1452. GPIO_PinWrite(0, 1, 0);
  1453. gNtcDev.flagC4 = 0;
  1454. ADC_GetDefaultConfig(&adcConfig);
  1455. adcConfig.channelConfig.thermalInput = ADC_ThermalInputAio4;
  1456. ADC_ChannelInit(ADC_ChannelThermal, ADC_UserAPP, &adcConfig, ADC_NTCVbatCaliChannelCallback);
  1457. ADC_StartConversion(ADC_ChannelThermal, ADC_UserAPP);
  1458. }
  1459. if(regMsg.request & ADC_REQ_BITMAP_INRES_CALI)
  1460. {
  1461. GPIO_PinWrite(0, 1, 0);
  1462. if(regMsg.param[NTC_Channel5_InresCali]>=ADC_AioResDivRatio1 && regMsg.param[NTC_Channel5_InresCali]<=ADC_AioResDivRatio1Over16){
  1463. #ifdef USING_PRINTF
  1464. //printf("%s[%d]\r\n",__FUNCTION__, __LINE__);
  1465. #endif
  1466. adcConfig.channelConfig.aioResDiv = regMsg.param[NTC_Channel5_InresCali];
  1467. }else{
  1468. #ifdef USING_PRINTF
  1469. //printf("%s[%d]\r\n",__FUNCTION__, __LINE__);
  1470. #endif
  1471. adcConfig.channelConfig.aioResDiv = ADC_AioResDivRatioDefault;
  1472. }
  1473. gNtcDev.flagC4 = 0;
  1474. ADC_ChannelInit(ADC_ChannelAio4, ADC_UserAPP, &adcConfig, ADC_NTCInresCaliChannelCallback);
  1475. ADC_StartConversion(ADC_ChannelAio4, ADC_UserAPP);
  1476. }
  1477. ret = osEventFlagsWait(adcEvtHandle, regMsg.request, osFlagsWaitAll, ADC_GET_RESULT_TIMOUT);
  1478. if(regMsg.request & ADC_REQ_BITMAP_VBAT)
  1479. {
  1480. ADC_ChannelDeInit(ADC_ChannelVbat, ADC_UserAPP);
  1481. gNtcDev.NTCvalue[0] = HAL_ADC_CalibrateRawCode(vbatChannelResult) * 16 / 3;
  1482. }
  1483. if(regMsg.request & ADC_REQ_BITMAP_TEMP)
  1484. {
  1485. ADC_ChannelDeInit(ADC_ChannelThermal, ADC_UserAPP);
  1486. gNtcDev.NTCvalue[1] = HAL_ADC_ConvertThermalRawCodeToTemperature(thermalChannelResult);
  1487. }
  1488. if(regMsg.request & ADC_REQ_BITMAP_CH1)
  1489. {
  1490. ADC_ChannelDeInit(ADC_ChannelAio1, ADC_UserAPP);
  1491. if(times==1){
  1492. gNtcDev.NTCvalue[2+NTC_Channel1]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel1])*REV_AioResDivRatioDefault;
  1493. #ifdef USING_PRINTF
  1494. //printf("%s[%d][%d]\r\n",__FUNCTION__, __LINE__,gNtcDev.NTCvalue[2+NTC_Channel1]);
  1495. #endif
  1496. if(gNtcDev.NTCvalue[2+NTC_Channel1]>(NTC_FullAioValue-10)){
  1497. regMsg.param[NTC_Channel1]=ADC_AioResDivRatioExtra;
  1498. times++;
  1499. goto retry;
  1500. }
  1501. }else{
  1502. gNtcDev.NTCvalue[2+NTC_Channel1]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel1])*REV_AioResDivRatioExtra;
  1503. }
  1504. }
  1505. if(regMsg.request & ADC_REQ_BITMAP_CH2)
  1506. {
  1507. ADC_ChannelDeInit(ADC_ChannelAio2, ADC_UserAPP);
  1508. if(times==1){
  1509. gNtcDev.NTCvalue[2+NTC_Channel2]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel2])*REV_AioResDivRatioDefault;
  1510. #ifdef USING_PRINTF
  1511. //printf("%s[%d][%d]\r\n",__FUNCTION__, __LINE__,gNtcDev.NTCvalue[2+NTC_Channel2]);
  1512. #endif
  1513. if(gNtcDev.NTCvalue[2+NTC_Channel2]>(NTC_FullAioValue-10)){
  1514. regMsg.param[NTC_Channel2]=ADC_AioResDivRatioExtra;
  1515. times++;
  1516. goto retry;
  1517. }
  1518. }else{
  1519. gNtcDev.NTCvalue[2+NTC_Channel2]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel2])*REV_AioResDivRatioExtra;
  1520. }
  1521. }
  1522. if(regMsg.request & ADC_REQ_BITMAP_CH3)
  1523. {
  1524. ADC_ChannelDeInit(ADC_ChannelAio3, ADC_UserAPP);
  1525. if(times==1){
  1526. gNtcDev.NTCvalue[2+NTC_Channel3]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel3])*REV_AioResDivRatioDefault;
  1527. #ifdef USING_PRINTF
  1528. //printf("%s[%d][%d]\r\n",__FUNCTION__, __LINE__,gNtcDev.NTCvalue[2+NTC_Channel3]);
  1529. #endif
  1530. if(gNtcDev.NTCvalue[2+NTC_Channel3]>(NTC_FullAioValue-10)){
  1531. regMsg.param[NTC_Channel3]=ADC_AioResDivRatioExtra;
  1532. times++;
  1533. goto retry;
  1534. }
  1535. }else{
  1536. gNtcDev.NTCvalue[2+NTC_Channel3]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel3])*REV_AioResDivRatioExtra;
  1537. }
  1538. }
  1539. if(regMsg.request & ADC_REQ_BITMAP_CH4 ||regMsg.request & ADC_REQ_BITMAP_CH5)
  1540. {
  1541. ADC_ChannelDeInit(ADC_ChannelThermal, ADC_UserAPP);
  1542. if(gNtcDev.flagC4){
  1543. gNtcDev.NTCvalue[2+NTC_Channel4]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel4]);
  1544. }else{
  1545. gNtcDev.NTCvalue[2+NTC_Channel5]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel5]);
  1546. }
  1547. }
  1548. if(regMsg.request & ADC_REQ_BITMAP_VBAT_CALI)
  1549. {
  1550. ADC_ChannelDeInit(ADC_ChannelThermal, ADC_UserAPP);
  1551. if(times==1){
  1552. gNtcDev.NTCvalue[2+NTC_Channel5_VbatCali]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel5_VbatCali]);
  1553. #ifdef USING_PRINTF
  1554. //printf("%s[%d][%d]\r\n",__FUNCTION__, __LINE__,gNtcDev.NTCvalue[2+NTC_Channel5_VbatCali]);
  1555. #endif
  1556. if(gNtcDev.NTCvalue[2+NTC_Channel5_VbatCali]>(NTC_FullAioValue-10)){
  1557. regMsg.param[NTC_Channel5_VbatCali]=ADC_AioResDivRatioExtra;
  1558. times++;
  1559. goto retry;
  1560. }
  1561. }else{
  1562. gNtcDev.NTCvalue[2+NTC_Channel5_VbatCali]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel5_VbatCali]);
  1563. }
  1564. }
  1565. if(regMsg.request & ADC_REQ_BITMAP_INRES_CALI)
  1566. {
  1567. ADC_ChannelDeInit(ADC_ChannelAio4, ADC_UserAPP);
  1568. if(times==1){
  1569. gNtcDev.NTCvalue[2+NTC_Channel5_InresCali]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel5_InresCali])*REV_AioResDivRatioDefault;
  1570. #ifdef USING_PRINTF
  1571. //printf("%s[%d][%d]\r\n",__FUNCTION__, __LINE__,gNtcDev.NTCvalue[2+NTC_Channel5_InresCali]);
  1572. #endif
  1573. if(gNtcDev.NTCvalue[2+NTC_Channel5_InresCali]>(NTC_FullAioValue-10)){
  1574. regMsg.param[NTC_Channel5_InresCali]=ADC_AioResDivRatioExtra;
  1575. times++;
  1576. goto retry;
  1577. }
  1578. }else{
  1579. gNtcDev.NTCvalue[2+NTC_Channel5_InresCali]= HAL_ADC_CalibrateRawCode(NTCChannelResult[NTC_Channel5_InresCali])*REV_AioResDivRatioExtra;
  1580. }
  1581. }
  1582. osEventFlagsSet(adcTrigerHandle, ADC_RECV_CONTROL_FLAG);
  1583. }
  1584. }
  1585. /**
  1586. \fn INT32 AdcTaskInit(void)
  1587. \param[in]
  1588. \brief create task for checking bat level
  1589. \return
  1590. */
  1591. INT32 AdcTaskInit(void)
  1592. {
  1593. gpio_pin_config_t config;
  1594. config.pinDirection = GPIO_DirectionOutput;
  1595. config.misc.initOutput = 1;
  1596. pad_config_t padConfig;
  1597. PAD_GetDefaultConfig(&padConfig);
  1598. padConfig.mux = PAD_MuxAlt0;
  1599. PAD_SetPinConfig(11, &padConfig);
  1600. GPIO_PinConfig(0, 0, &config);
  1601. GPIO_PinWrite(0, 1, 1);
  1602. memset(&gNtcDev , 0 ,sizeof(NtcResult_t));
  1603. if(adcMsgHandle == NULL)
  1604. {
  1605. adcMsgHandle = osMessageQueueNew(ADC_MSG_MAX_NUM,sizeof(adcReqMsg), NULL);
  1606. if(adcMsgHandle == NULL)
  1607. return 1;
  1608. }
  1609. if(adcTrigerHandle == NULL)
  1610. {
  1611. adcTrigerHandle = osEventFlagsNew(NULL);
  1612. if(adcTrigerHandle == NULL)
  1613. return 1;
  1614. }
  1615. if(adcEvtHandle == NULL)
  1616. {
  1617. adcEvtHandle = osEventFlagsNew(NULL);
  1618. if(adcEvtHandle == NULL)
  1619. return 1;
  1620. }
  1621. if(adcTaskHandle == NULL)
  1622. {
  1623. osThreadAttr_t task_attr;
  1624. memset(&task_attr , 0 , sizeof(task_attr));
  1625. task_attr.name = "batAdc";
  1626. task_attr.priority = osPriorityNormal1;
  1627. task_attr.cb_mem = &adcTask;
  1628. task_attr.cb_size = sizeof(StaticTask_t);
  1629. task_attr.stack_mem = adcTaskStack;
  1630. task_attr.stack_size =ADC_TASK_STACK_SIZE;
  1631. memset(& adcTaskStack, 0xa5, ADC_TASK_STACK_SIZE);
  1632. adcTaskHandle = osThreadNew(AdcProcess , NULL,&task_attr);
  1633. if(adcTaskHandle == NULL)
  1634. return 1;
  1635. }
  1636. return 0;
  1637. }
  1638. /**
  1639. \fn void PowerPinConfig(IOType iotype)
  1640. \param[in]
  1641. \brief config PWR pin to gpiol
  1642. \return
  1643. */
  1644. void PowerPinConfig(IOType iotype)
  1645. {
  1646. gpio_pin_config_t config;
  1647. config.pinDirection = GPIO_DirectionOutput;
  1648. config.misc.initOutput = 1;
  1649. pad_config_t padConfig;
  1650. PAD_GetDefaultConfig(&padConfig);
  1651. if(iotype == AON_IO)
  1652. {
  1653. padConfig.mux = PAD_MuxAlt0;
  1654. PAD_SetPinConfig(31, &padConfig);
  1655. GPIO_PinConfig(1, AON_GPS_POWER2, &config);
  1656. GPIO_PinWrite(1, 1 << AON_GPS_POWER2, 1 << AON_GPS_POWER2);
  1657. PAD_SetPinConfig(32, &padConfig);
  1658. GPIO_PinConfig(1, AON_RELAY_DRV, &config);
  1659. GPIO_PinWrite(1, 1 << AON_RELAY_DRV, 1 << AON_RELAY_DRV);
  1660. PAD_SetPinConfig(35, &padConfig);
  1661. GPIO_PinConfig(1, AON_WAKEUP, &config);
  1662. GPIO_PinWrite(1, 1 << AON_WAKEUP, 1 << AON_WAKEUP);
  1663. padConfig.mux = PAD_MuxAlt7;
  1664. PAD_SetPinConfig(5, &padConfig);
  1665. GPIO_PinConfig(1, FEM_GPS_RSTN, &config);
  1666. GPIO_PinWrite(1, 1 << FEM_GPS_RSTN, 1 << FEM_GPS_RSTN);
  1667. #if 1
  1668. padConfig.mux = PAD_MuxAlt7;
  1669. padConfig.pullSelect = PAD_PullInternal;
  1670. padConfig.pullUpEnable = PAD_PullUpEnable;
  1671. padConfig.pullDownEnable = PAD_PullDownDisable;
  1672. PAD_SetPinConfig(8, &padConfig);
  1673. config.pinDirection = GPIO_DirectionInput;
  1674. config.misc.initOutput = 0;
  1675. GPIO_PinConfig(1, FEM_GPS_PPS, &config);
  1676. #else
  1677. padConfig.mux = PAD_MuxAlt7;
  1678. PAD_SetPinConfig(8, &padConfig);
  1679. GPIO_PinWrite(1, 1 << FEM_GPS_PPS, 1 << FEM_GPS_PPS);
  1680. #endif
  1681. }
  1682. else
  1683. {
  1684. /*Normal IO*/
  1685. #if 0
  1686. GPIO_PinConfig(0, GPIO_MOS_DRV1, &config);
  1687. GPIO_PinWrite(0, 1 << GPIO_MOS_DRV1, 1 << GPIO_MOS_DRV1);
  1688. GPIO_PinConfig(0, GPIO_MOS_DRV2, &config);
  1689. GPIO_PinWrite(0, 1 << GPIO_MOS_DRV2, 1 << GPIO_MOS_DRV2);
  1690. #endif
  1691. padConfig.mux = PAD_MuxAlt0;
  1692. PAD_SetPinConfig(28, &padConfig);
  1693. GPIO_PinConfig(0, GPIO_POWER_LED, &config);
  1694. GPIO_PinWrite(0, 1 << GPIO_POWER_LED, 1 << GPIO_POWER_LED);
  1695. }
  1696. }
  1697. /**
  1698. \fn void posGGAReset(void)
  1699. \param[in]
  1700. \brief reset gps
  1701. \return
  1702. */
  1703. void posGGAReset(void)
  1704. {
  1705. gpio_pin_config_t config;
  1706. config.pinDirection = GPIO_DirectionOutput;
  1707. config.misc.initOutput = 1;
  1708. pad_config_t padConfig;
  1709. PAD_GetDefaultConfig(&padConfig);
  1710. padConfig.mux = PAD_MuxAlt7;
  1711. PAD_SetPinConfig(5, &padConfig);
  1712. GPIO_PinConfig(1, FEM_GPS_RSTN, &config);
  1713. GPIO_PinWrite(1, 1 << FEM_GPS_RSTN, 0);
  1714. osDelay(1000/portTICK_PERIOD_MS);
  1715. GPIO_PinConfig(1, FEM_GPS_RSTN, &config);
  1716. GPIO_PinWrite(1, 1 << FEM_GPS_RSTN, 1 << FEM_GPS_RSTN);
  1717. config.pinDirection = GPIO_DirectionInput;
  1718. config.misc.initOutput = 0;
  1719. GPIO_PinConfig(1, FEM_GPS_RSTN, &config);
  1720. }
  1721. /**
  1722. \fn void GPSPowerCtr(bool )
  1723. \param[in]
  1724. \brief reset gps
  1725. \return
  1726. */
  1727. void GPSPowerCtr(bool on)
  1728. {
  1729. gpio_pin_config_t config;
  1730. config.pinDirection = GPIO_DirectionOutput;
  1731. config.misc.initOutput = 1;
  1732. pad_config_t padConfig;
  1733. PAD_GetDefaultConfig(&padConfig);
  1734. padConfig.mux = PAD_MuxAlt0;
  1735. PAD_SetPinConfig(31, &padConfig);
  1736. GPIO_PinConfig(1, AON_GPS_POWER2, &config);
  1737. if(on){
  1738. GPIO_PinWrite(1, 1 << AON_GPS_POWER2, 0);
  1739. }else{
  1740. GPIO_PinWrite(1, 1 << AON_GPS_POWER2, 1<<AON_GPS_POWER2);
  1741. }
  1742. }
  1743. /**
  1744. \fn void posGGAServiceStart(posGGACallBack )
  1745. \param[in]
  1746. \brief powr on gps
  1747. \return
  1748. */
  1749. INT32 posGGAServiceStart( posGGACallBack callBack)
  1750. {
  1751. if(callBack == NULL){
  1752. return -1;
  1753. }else{
  1754. GPSPowerCtr(true);
  1755. gGPSDataCBfunc = callBack;
  1756. return 0;
  1757. }
  1758. }
  1759. /**
  1760. \fn void posGGAServiceStop(void )
  1761. \param[in]
  1762. \brief stop gps
  1763. \return
  1764. */
  1765. void posGGAServiceStop( void)
  1766. {
  1767. GPSPowerCtr(false);
  1768. gGPSDataCBfunc = NULL;
  1769. }
  1770. // 字符串删除函数
  1771. void strdel(char * str,char c)
  1772. {
  1773. char *p = str;
  1774. while(*str)
  1775. {
  1776. if(*str!=c)
  1777. *p++ = *str;
  1778. str++;
  1779. }
  1780. *p = '\0';
  1781. }
  1782. uint32_t location_handle(char *in1)
  1783. {
  1784. uint32_t location_temp;
  1785. uint32_t location_degree;
  1786. uint32_t location_min;
  1787. location_temp = atol(in1);
  1788. location_degree = location_temp/(1e7);
  1789. location_degree = location_degree*(1e6);
  1790. location_min = location_temp-location_degree*10;
  1791. location_min = location_min/6;
  1792. location_temp = location_degree+location_min;
  1793. return location_temp;
  1794. }
  1795. /**
  1796. \fn void gpsProcess(void* arg)
  1797. \param[in]
  1798. \brief handle gps init ,deinit and convert process
  1799. \return
  1800. */
  1801. static void GpsProcess(void* arg)
  1802. {
  1803. gpsReqMsg msg;
  1804. GPS_INFO Gps_buffer;
  1805. Gps_buffer.latitude = 0xffffffff;
  1806. Gps_buffer.longitude = 0xffffffff;
  1807. char *p=NULL;
  1808. const char *delim = "\n";
  1809. char *databuffer[14];
  1810. /**
  1811. *databuffer内容格式:
  1812. * 定位标识,时间,位置有效标识,纬度,纬度指示,经度,经度指示,地面速率,地面航向,日期
  1813. **/
  1814. #ifdef USING_PRINTF
  1815. printf("%s[%d]\r\n",__FUNCTION__, __LINE__);
  1816. #endif
  1817. while(1)
  1818. {
  1819. //char temp[] = "$GNGGA,082626.00,2939.91801,N,10637.09500,E,1,03,2.34,-20.3,M,,M,,*40";
  1820. char temp[] = "$GNRMC,082626.000,A,2939.91801,N,10637.09500,E,0.543,30.254,261120,,,A,V*17";
  1821. osMessageQueueGet(gpsMsgHandle, &msg, 0, osWaitForever);
  1822. if (msg.dataPtr)
  1823. {
  1824. //void *msgtemp = msg.dataPtr;//取指针
  1825. #ifdef USING_PRINTF
  1826. //printf("\nGpsProcess msgptr data:%s\r\n",msg.dataPtr);
  1827. #endif
  1828. p = strtok(msg.dataPtr,delim);//将信息进行分割
  1829. #ifdef USING_PRINTF
  1830. printf("\nP msgptr data:%s\r\n",p);
  1831. #endif
  1832. int i=0;
  1833. p = strtok(p,",");//只取第1行的信息RMC
  1834. //p = strtok(temp,",");//模拟测试
  1835. if (strcmp(p,"$GNRMC")==0)
  1836. {
  1837. while (p)
  1838. {
  1839. // #ifdef USING_PRINTF
  1840. // printf("p:%s\r\n",p);
  1841. // #endif
  1842. databuffer[i]=p;
  1843. p = strtok(NULL,",");
  1844. i++;;
  1845. }
  1846. if (strcmp(databuffer[1],"V")==0|strcmp(databuffer[2],"V")==0)
  1847. {
  1848. #ifdef USING_PRINTF
  1849. printf("Gpsdata invalide\n");
  1850. #endif
  1851. Gps_buffer.status = 0x00;
  1852. Gps_buffer.speed = 0xffff;
  1853. Gps_buffer.direction= 0xffff;
  1854. }
  1855. else if (strcmp(databuffer[2],"A")==0)
  1856. {
  1857. uint32_t speedtemp;
  1858. #ifdef USING_PRINTF
  1859. printf("Gpsdata valide\n");
  1860. #endif
  1861. Gps_buffer.status = 0x01;//有效,东经,北纬写定
  1862. Gps_buffer.satellite_num = 03;//卫星数目写入1
  1863. strdel(databuffer[3],'.');
  1864. strdel(databuffer[5],'.');
  1865. strdel(databuffer[7],'.');
  1866. speedtemp = atol(databuffer[7])*1852;//节换算单位,1节=1.852km每小时
  1867. Gps_buffer.speed = speedtemp/1e5;
  1868. Gps_buffer.latitude = location_handle(databuffer[3]);
  1869. Gps_buffer.longitude = location_handle(databuffer[5]);
  1870. Gps_buffer.altitude = 00;
  1871. if(Gps_buffer.speed>=100)//大于10km/h才输出方位
  1872. {
  1873. Gps_buffer.direction = atol(databuffer[8]);
  1874. }
  1875. Gps_buffer.direction = 0xfffe;
  1876. osMessageQueuePut(gpsMsgQueue, &Gps_buffer, 0, 1000);
  1877. }
  1878. }
  1879. //free(msgtemp);
  1880. //msgtemp=NULL;
  1881. }
  1882. msg.dataPtr=NULL;
  1883. if (Sleep_Flag)
  1884. {
  1885. // osThreadExit();
  1886. while (true)
  1887. {
  1888. osDelay(10000);
  1889. }
  1890. break;
  1891. }
  1892. }
  1893. }
  1894. /**
  1895. \fn INT32 GpsTaskInit(void)
  1896. \param[in]
  1897. \brief create task for checking gps data
  1898. \return
  1899. */
  1900. INT32 GpsTaskInit(void)
  1901. {
  1902. if(gpsMsgHandle == NULL)
  1903. {
  1904. gpsMsgHandle = osMessageQueueNew(1,sizeof(gpsReqMsg), NULL);
  1905. if(gpsMsgHandle == NULL)
  1906. return 1;
  1907. }
  1908. if(gpsTaskHandle == NULL)
  1909. {
  1910. osThreadAttr_t task_attr;
  1911. memset(&task_attr , 0 , sizeof(task_attr));
  1912. task_attr.name = "GPS";
  1913. task_attr.priority = osPriorityBelowNormal7;
  1914. task_attr.cb_mem = &gpsTask;
  1915. task_attr.cb_size = sizeof(StaticTask_t);
  1916. task_attr.stack_mem = gpsTaskStack;
  1917. task_attr.stack_size =GPS_TASK_STACK_SIZE;
  1918. memset(& gpsTaskStack, 0xa5, GPS_TASK_STACK_SIZE);
  1919. gpsTaskHandle = osThreadNew(GpsProcess , NULL,&task_attr);
  1920. if(gpsTaskHandle == NULL)
  1921. return 1;
  1922. }
  1923. return 0;
  1924. }