board.c 9.3 KB

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