board.c 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. #include "includes.h"
  2. //////////////////////封装一下AT接口/////////////////////////////////
  3. void msgAtSend(char *at){
  4. ModemSendAt(at);
  5. }
  6. void msgAtSends(char *at ,int len){
  7. ModemSendAt(at);
  8. }
  9. //////日志打印口配置/////////////////
  10. void my_usb_evt_cb(lsUSBEvent_t event, unsigned long p){
  11. LSAPI_OSI_Event_t usb_event;
  12. usb_event.id = OHPOC_EVENT_USB;
  13. usb_event.param1=event;
  14. //wlog_info("my_usb_evt_cb:%d",event);
  15. osiEventTrySend((LSAPI_OSI_Thread_t *)p, &usb_event, 0);
  16. }
  17. LSAPI_Device_USBConfig_t usb_cfg = {
  18. .name = LSAPI_DEV_USB_COM7,
  19. .event_cb = my_usb_evt_cb,
  20. };
  21. bool usbThreadExit=false;
  22. LSAPI_Device_t *usbdev=NULL;
  23. LSAPI_OSI_Thread_t *gUsbWRTd;
  24. static void usbPortHandler(void *param){
  25. int ret;
  26. unsigned char buffer[100];
  27. LSAPI_OSI_Event_t waitevent;
  28. LSAPI_Log_Debug("usb create ok");
  29. while(usbThreadExit==false){
  30. LSAPI_OSI_EventWait(LSAPI_OSI_ThreadCurrent(), &waitevent);
  31. if(waitevent.param1==LS_USB_EVENT_RX_ARRIVED){
  32. while(LSAPI_Device_ReadAvail(usbdev)>0){
  33. ret = LSAPI_Device_Read(usbdev, buffer, sizeof(buffer));
  34. if(ret< sizeof(buffer)) buffer[ret]=0;
  35. usbCmdHandler(buffer,ret);
  36. }
  37. //WakeupNow("usbCallBack");
  38. }
  39. }
  40. LSAPI_Log_Debug("usbPortHandler exit");
  41. LSAPI_Device_Close(usbdev);
  42. gUsbWRTd=NULL;
  43. LSAPI_OSI_ThreadExit();
  44. }
  45. static bool logPortInit(void){
  46. gUsbWRTd=LSAPI_OSI_ThreadCreate("usb", usbPortHandler, NULL, LSAPI_OSI_PRIORITY_NORMAL, 1024*32, 4);
  47. if(gUsbWRTd==NULL) return false;
  48. usb_cfg.event_cb_ctx = gUsbWRTd;
  49. usbdev = LSAPI_Device_USBCreateEx(&usb_cfg);
  50. if(usbdev==NULL){
  51. usbThreadExit=true;
  52. LSAPI_Log_Debug("usbex create err");
  53. return false;
  54. }
  55. if(false==LSAPI_Device_Open(usbdev)){
  56. LSAPI_Log_Debug("usb LSAPI_Device_Open failed");
  57. return false;
  58. }
  59. LSAPI_Device_SetAutoSleep(usbdev, 500);
  60. LSAPI_Log_Debug("usbComInit done");
  61. return true;
  62. }
  63. void usbOutPut(unsigned char *info, int len){
  64. if(NULL==usbdev) return;
  65. if(LSAPI_Device_WriteAvail(usbdev) != -1) LSAPI_Device_Write(usbdev, info,len);
  66. }
  67. void usbOutPutStr(unsigned char *info){
  68. if(NULL==usbdev) return;
  69. if(LSAPI_Device_WriteAvail(usbdev) != -1) LSAPI_Device_Write(usbdev, info,strlen(info));
  70. }
  71. static void lcdInitTask(void *param){
  72. //MSG_WARN(1,"lcd init thread start");
  73. if(0==lcdDrv_Init(0)) MSG_INFO(1, "lcd init ok");
  74. else MSG_INFO(1, "lcd init failed");
  75. guiInit();
  76. MSG_WARN(1,"lcd init thread end");
  77. sutApp.guiStatus=1;
  78. LSAPI_OSI_ThreadExit();
  79. }
  80. static void lcdsInit(void){
  81. if(NULL==LSAPI_OSI_ThreadCreate("lcdinit", lcdInitTask, NULL, LSAPI_OSI_PRIORITY_NORMAL, LCD_INIT_TASK_THREAD_STACK, 2)){
  82. MSG_WARN(1,"lcd init thread error");
  83. return;
  84. }
  85. }
  86. //////////////////gpio及定时器/////////////////////////////
  87. LSAPI_OSI_Timer_t *pKeytimer_t=NULL;
  88. LSAPI_OSI_Timer_t *pBackLightTimer_t=NULL;
  89. bool pkeyTimerCtl=false;
  90. unsigned short keyStatus=0;
  91. unsigned short getKeyValue(){return keyStatus;}
  92. static void startKeyTimer(void){
  93. if(NULL==pKeytimer_t) return;
  94. if(pkeyTimerCtl==true) return;
  95. pkeyTimerCtl=true;
  96. LSAPI_OSI_TimerStart(pKeytimer_t,KEY_TIMER_TICK);
  97. }
  98. void stopKeyTimer(void){
  99. pkeyTimerCtl=false;
  100. LSAPI_OSI_TimerStop(pKeytimer_t);
  101. }
  102. static unsigned int msTick=0;//用于做应用层的非休眠时定时器
  103. unsigned int getAppTick(void){return msTick;}
  104. static void Timeroutcallback(void *param){
  105. //毿00秒去检测键值状怿去抖势
  106. //检测按锿
  107. keyCheck(keyStatus);
  108. msTick ++;
  109. //EarDlyCheck();
  110. if(pkeyTimerCtl==true) LSAPI_OSI_TimerStart(pKeytimer_t,KEY_TIMER_TICK);
  111. }
  112. LSAPI_Device_t *LcdBlCtl;
  113. LSAPI_Device_t *RedGpio;
  114. LSAPI_Device_t *GreenGpio;
  115. LSAPI_Device_t *SpkGpio;
  116. #define RED_GPIO_ID 18
  117. #define GREEN_GPIO_ID 22
  118. #define SPK_GPIO_ID 21
  119. void gpioConfigOutput(void){
  120. bool write_value = false;
  121. LSAPI_GpioConfig_t gpioConfig = {0};
  122. // config property
  123. gpioConfig.mode = LS_GPIO_OUTPUT;
  124. gpioConfig.out_level=true;
  125. // create instance
  126. gpioConfig.id = RED_GPIO_ID;
  127. RedGpio = LSAPI_Device_GPIOCreate(&gpioConfig);
  128. gpioConfig.id = GREEN_GPIO_ID;
  129. GreenGpio = LSAPI_Device_GPIOCreate(&gpioConfig);
  130. gpioConfig.id = SPK_GPIO_ID;
  131. SpkGpio = LSAPI_Device_GPIOCreate(&gpioConfig);
  132. LSAPI_Device_Open(RedGpio);
  133. LSAPI_Device_Write(RedGpio, (void *)&write_value, 1);
  134. LSAPI_Device_Open(GreenGpio);
  135. LSAPI_Device_Write(GreenGpio, (void *)&write_value, 1);
  136. LSAPI_Device_Open(SpkGpio);
  137. LSAPI_Device_Write(SpkGpio, (void *)&write_value, 1);
  138. LcdBlCtl=LSAPI_Device_LedCreate(LS_LED_1);
  139. LSAPI_Device_Open(LcdBlCtl);
  140. lcdBackList(0);
  141. }
  142. void redLedCtl(bool onoff){
  143. bool write_value = onoff;
  144. LSAPI_Device_Write(RedGpio, (void *)&write_value, 1);
  145. }
  146. void greenLedCtl(bool onoff){
  147. bool write_value = onoff;
  148. LSAPI_Device_Write(GreenGpio, (void *)&write_value, 1);
  149. }
  150. void spkCtl(bool onoff){
  151. bool write_value = onoff;
  152. LSAPI_Device_Write(SpkGpio, (void *)&write_value, 1);
  153. }
  154. void lcdBackList(char onoff){
  155. unsigned int led_value;
  156. if(onoff==0) led_value=0;
  157. else led_value=1;
  158. LSAPI_Device_Write(LcdBlCtl, &led_value, 1);
  159. }
  160. void startBackLightTimer(int time){
  161. if(NULL==pBackLightTimer_t) return;
  162. LSAPI_OSI_TimerStart(pBackLightTimer_t,time);
  163. }
  164. static void gpioTask(void *param){
  165. unsigned int param1,param2,param3;
  166. LSAPI_OSI_Event_t event = {};
  167. //创建一个定时器
  168. if(NULL == pKeytimer_t) pKeytimer_t = LSAPI_OSI_TimerCreate(LSAPI_OSI_ThreadCurrent(), Timeroutcallback, NULL);
  169. if(NULL == pKeytimer_t) MSG_WARN(1,"gpio timer init failed");
  170. if(NULL == pBackLightTimer_t) pBackLightTimer_t = LSAPI_OSI_TimerCreate(LSAPI_OSI_ThreadCurrent(), backLightCb, NULL);
  171. if(NULL == pBackLightTimer_t) MSG_WARN(1,"backlight timer init failed");
  172. startKeyTimer();
  173. gpioConfigOutput();
  174. uioStatusInit();
  175. for(;;){
  176. LSAPI_OSI_EventWait(LSAPI_OSI_ThreadCurrent(), &event);
  177. param1=event.param1;
  178. param2=event.param2;
  179. param3=event.param3;
  180. if(event.id==OHPOC_EVENT_KEY_NOR) keyHandler((unsigned short)param1,(unsigned char)param2);
  181. }
  182. }
  183. LSAPI_OSI_Thread_t *gGpioTd=NULL;
  184. static void gpiosInit(void){
  185. gGpioTd=LSAPI_OSI_ThreadCreate("gpio", gpioTask, NULL, LSAPI_OSI_PRIORITY_NORMAL, 1024*32, 5);
  186. if(NULL==gGpioTd) MSG_WARN(1,"gpioThread Error");
  187. else MSG_WARN(1,"gpioThread ok");
  188. }
  189. void keySendEvent(unsigned short key, unsigned char keyType){
  190. threadSendEvent(gGpioTd,OHPOC_EVENT_KEY_NOR, key,keyType,NULL);
  191. tryWakeupApp();
  192. }
  193. //////////////////按键实始化//////////////////////////
  194. #define POWER_KEY_PRESSED_TIMEOUT (3000)
  195. typedef struct ls_key{
  196. bool ready_shutdown;
  197. LSAPI_OSI_Timer_t *key_timer;
  198. }lsKey_t;
  199. static void _lsKeyTimer(void *p){
  200. lsKey_t *key = (lsKey_t *)p;
  201. key->ready_shutdown = true;
  202. }
  203. static void _lsKeyCB(lskeyMap_t id, lskeyState_t evt, void *p){
  204. lsKey_t *key = (lsKey_t *)p;
  205. uint8_t status;
  206. if (evt & LS_KEY_STATE_PRESS) keyStatus |= (1<<id);
  207. if (evt & LS_KEY_STATE_RELEASE) keyStatus &= ~(1<<id);
  208. startKeyTimer();
  209. }
  210. void keyPadInit(void){
  211. lsKey_t *key = (lsKey_t *)LSAPI_OSI_Malloc(sizeof(lsKey_t));
  212. if (key == NULL){
  213. MSG_WARN(1,"ls_keypad:calloc faild");
  214. return;
  215. }
  216. key->key_timer = LSAPI_OSI_TimerCreate(NULL, _lsKeyTimer, key);
  217. if (key->key_timer == NULL){
  218. LSAPI_OSI_Free(key);
  219. return;
  220. }
  221. LSAPI_Device_KeypadCreate(_lsKeyCB, key);
  222. }
  223. //////////////////////////PA控制接口(外放使用免提,耳机FM)///////////////////////////
  224. //8735
  225. //#define PA_MODE_AB
  226. //#define PA_MODE_D
  227. //#define PA_MODE_FM
  228. //#define PA_MODE_K
  229. #define PA_MODE_MIANTI
  230. void delayUs(int64_t time){
  231. int64_t i;
  232. i=LSAPI_OSI_UpTimeUs()+time;
  233. while(LSAPI_OSI_UpTimeUs()<i);
  234. }
  235. void paControl(bool status){
  236. char i=0;
  237. char PACNT=sutApp.pcant;
  238. if(status==true){
  239. MSG_INFO(1, "PACNT:%d",PACNT);
  240. for(i=0;i<PACNT;i++){
  241. spkCtl(true);
  242. delayUs(2);
  243. spkCtl(false);
  244. delayUs(2);
  245. }
  246. spkCtl(true);
  247. }else spkCtl(false);
  248. }
  249. ///////////////////////PA控制结束/////////////////////////////////
  250. /////////////////////PWM//////////////////////////
  251. void pttBeepStart(bool isMicReq){
  252. // if(sutApp.volLev<=0) return;//如果音量调到最小,对讲不产生tone音,当然后对讲播放也没有声音了
  253. // if(true==isMicReq) pwmBeepStart(500, 50);
  254. // else pwmBeepStart(500, 50);
  255. }
  256. void beepStart(int freq){
  257. // //const unsigned char duty[5]={100,99,98,97,96};
  258. // //const unsigned char duty[10]={10,9,8,7,6,5,4,3,2,1};
  259. // int index=getDutyBySpk();
  260. // if(index==0) return;//最小声时直接不需要播放了
  261. // pwmBeepStart(freq, index);
  262. }
  263. void beepStop(void){
  264. // nwy_pwm_stop(pwm_p);
  265. // MSG_INFO(1, "beep stop");
  266. }
  267. //////////////////对外输出板级初始化接口
  268. void boardInit(void){
  269. if(logPortInit()==true) MSG_INFO(1, "Log ok");
  270. gpiosInit();
  271. CreateSerialAtThead();
  272. lcdsInit();
  273. keyPadInit();
  274. }