| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354 |
- /********************************** (C) COPYRIGHT *******************************
- * File Name : MS928x_mpi.c
- * Author : Wingcool
- * Version : V1.0
- * Date : 2023/2/22
- * Description : ms928x SDK升级操作
- *******************************************************************************/
- /******************************************************************************/
- /* 头文件包含 */
- #include "include.h"
- //#include <GoodixTouch.h>
- #include "CONFIG.h"
- //#include "CH57x_common.h"
- #include "TouchCommon.h"
- //#include "HAL.h"
- //#include "hiddev.h"
- //#include "hidtouch.h"
- #include "iic.h"
- //#include "DEBUG.H"
- #include "HidReport.h"
- //#include "usb_driver.H"
- //#include "I2CTouchService.h"
- //#include "Flash.h"
- //#include "hidReportDesc.h"
- //#include "central.h"
- //#include "RF_PHY.h"
- //#include "Flash.h"
- #include "tmos.h"
- #include "commlib.h"
- #include "MS928x.h"
- #include "MS928x_mpi.h"
- #include "mst_typedef.h"
- /*********************************************************************
- * GLOBAL TYPEDEFS
- */
- #define MS_SERVICE 0x0001
- #define HID_DEBUG_EVT 0x0200
- #define PERIO_100ms 160
- #define PERIO_1s 1600
- /*********************************************************************/
- UINT8 byIicDelay = 0; //default 400KHz
- static UINT8 MS928xTaskId = INVALID_TASK_ID;
- BOOL bPressKeyFlag = 0; //press reset key or not
- UINT16 wHPixelShift,wVPixelShift; //
- static UINT16 MS928x_ProcessEvent( UINT8 task_id, UINT16 events );
- void Delay_ms(UINT8 u8ms)
- {
- delay_ms(u8ms);
- }
- void Delay_us(UINT8 u8us)
- {
- delay_us(u8us);
- }
- void I2C_Sel_Speed(UINT8 u8speed)
- {
- switch (u8speed)
- {
- case I2C_SPEED_20K:
- byIicDelay = 20; //20K
- break;
- case I2C_SPEED_100K:
- byIicDelay = 0; //100K
- break;
- case I2C_SPEED_400K:
- byIicDelay = 0; //400K
- break;
- case I2C_SPEED_750K:
- byIicDelay = 0; //400K
- break;
- case 100:
- byIicDelay = 0; //100K
- break;
- case 20:
- byIicDelay = 20; //20K
- break;
- default:
- byIicDelay = 0; //400K
- break;
- }
- //byIicDelay = 20; //20K
- }
- UINT8 I2C16_ReadByte(UINT8 u8addr, UINT16 u16index)
- {
- GT_CMD_WR = u8addr;
- GT_CMD_RD = u8addr + 1;
- u16index = ((u16index & 0xff00) >> 8) + ((u16index & 0x00ff) << 8);
- return IICReadOneByte(u16index);
- }
- void I2C16_WriteByte(UINT8 u8addr, UINT16 u16index, UINT8 u8value)
- {
- GT_CMD_WR = u8addr;
- GT_CMD_RD = u8addr + 1;
- u16index = ((u16index & 0xff00) >> 8) + ((u16index & 0x00ff) << 8);
- IICWriteOneByte(u16index, u8value);
- }
- BOOL I2C_ReadBytes(UINT8 u8addr, UINT8 u8index, UINT8 *pIn, UINT8 u8len)
- {
- GT_CMD_WR = u8addr;
- GT_CMD_RD = u8addr + 1;
- UINT16 u16index = (UINT16)u8index * 256;
- return IICReadBytes(u16index, pIn, u8len);
- }
- //UINT8 I2C_ReadByte(UINT8 u8addr, UINT8 u8index)
- //{
- //
- //}
- //
- //void I2C_WriteByte(UINT8 u8addr, UINT8 u8index, UINT8 u8value)
- //{
- //
- //}
- void Sys_Reset(void)
- {
- gpio_init_typedef gpio_init_structure;
- gpio_init_structure.gpio_dir = GPIO_DIR_OUTPUT;
- gpio_init_structure.gpio_fen = GPIO_FEN_GPIO;
- gpio_init_structure.gpio_fdir = GPIO_FDIR_SELF;
- gpio_init_structure.gpio_mode = GPIO_MODE_DIGITAL;
- gpio_init_structure.gpio_pupd = GPIO_PUPD_PU10K;
- gpio_init_structure.gpio_drv = GPIO_DRV_6MA;
- gpio_init_structure.gpio_pin = RST_PIN;
- gpio_init(GPIOA_REG, &gpio_init_structure);
- gpio_reset_bits(GPIOA_REG, RST_PIN);
- delay_us(200);
- gpio_init_structure.gpio_dir = GPIO_DIR_INPUT;
- gpio_init(GPIOA_REG, &gpio_init_structure);
- gpio_set_bits(GPIOA_REG, RST_PIN);
- }
- void MS928X_MPI_Init(BOOL bpresskeyflag)
- {
- UINT8 u8status;
- SYSPARAM_T stParam;
- tmos_stop_task(MS928xTaskId, MS_SERVICE);
- Sys_Reset();
- memset(&stParam, 0, sizeof(SYSPARAM_T));
- stParam.u8chipAddr = MS928X_I2C_ADDR_92; //MS928X IIC address, SASEL Pin -> GND, select 0x9A
- stParam.u16sysConfig = SYS_CFG_SIG_CHANNEL_1;// | SYS_CFG_SIG_SYNC_SOG_1;// | SYS_CFG_ADDPLL_HIGH_REFCLK; // 配置根据系统板来选择信号输入通道
- stParam.videoParam.u8sourceIn = IN_ANALOG_VGA; // 当前输入信号选择 VGA input
- // 调用初始化函数
- u8status = MS928X_Init(&stParam);
- //PRINT("MS928X init status:0x%x\n", u8status);
- if (bpresskeyflag) //press key
- {
- bPressKeyFlag = 1;
- }
- tmos_start_task(MS928xTaskId, MS_SERVICE, PERIO_100ms);
- }
- void MS928XInit()
- {
- UINT8 u8hvpixeldata[4];
- if (bTransmitEn == TRUE) //transmit
- {
- return;
- }
- GT_CMD_WR = MS928X_I2C_ADDR_92;
- GT_CMD_RD = MS928X_I2C_ADDR_92 + 1;
- if (GetHVPixel(u8hvpixeldata))
- {
- //PRINT("Get HV Pixel Success\n");
- wHPixelShift = (UINT16)(((UINT16)u8hvpixeldata[0] << 8) + u8hvpixeldata[1]);
- wVPixelShift = (UINT16)(((UINT16)u8hvpixeldata[2] << 8) + u8hvpixeldata[3]);
- }
- else //没有存储,给一个默认的
- {
- //PRINT("No HV Pixel Data\n");
- wHPixelShift = 1593;
- wVPixelShift = 1;
- }
- //PRINT("wHPixelShift:%05d, wVPixelShift:%05d\n", wHPixelShift, wVPixelShift);
- MS928xTaskId = TMOS_ProcessEventRegister(MS928x_ProcessEvent);
- // if (MS928xTaskId == INVALID_TASK_ID)
- // {
- // MS928xTaskId = TMOS_ProcessEventRegister(MS928x_ProcessEvent);
- // tmos_set_event(MS928xTaskId, HID_DEBUG_EVT);
- // }
- tmos_set_event(MS928xTaskId, HID_DEBUG_EVT);
- MS928X_MPI_Init(0);
- }
- void MS928XService()
- {
- VIDEOSHIFT_T sysVideoShift;
- UINT8 u8status;
- //UINT8 u8vic = 0;
- UINT8 u8hvpixeldatabuf[4];
- u8status = MS928X_Poll(); // 返回当前系统运行状态
- //PRINT("MS928X Poll status:%d\n", u8status);
- if (u8status == STATE_SUCCESS)
- {
- //WDT_DIS();
- //PRINT("Disable watch dog\n");
- //u8vic = MS928X_GetInputVideoMode();
- //PRINT("MS928X vic:%03d\n", u8vic);
- //MS928X_SetVideo(); // 设置 Video
- MS928X_SetVideo(&sysVideoShift); // 设置 Video
- //MS928X_SetAudio(); // 设置 Audio
- //if (u8vic == 4)
- {
- if (bPressKeyFlag == 1) //press key
- {
- bPressKeyFlag = 0;
- u8hvpixeldatabuf[0] = sysVideoShift.u16HShift >> 8;
- u8hvpixeldatabuf[1] = sysVideoShift.u16HShift & 0xFF;
- u8hvpixeldatabuf[2] = sysVideoShift.u16VShift >> 8;
- u8hvpixeldatabuf[3] = sysVideoShift.u16VShift & 0xFF;
- wHPixelShift = sysVideoShift.u16HShift;
- wVPixelShift = sysVideoShift.u16VShift;
- if (StoreHVPixel(u8hvpixeldatabuf))
- {
- //PRINT("Store HV Pixel Success\n");
- }
- }
- else
- {
- sysVideoShift.u16HShift = wHPixelShift;
- sysVideoShift.u16VShift = wVPixelShift;
- }
- //MS928X_WriteShift(1593,1);
- //MS928X_WriteShift(sysVideoShift.u16HShift,sysVideoShift.u16VShift);
- //MS928X_Video_SetShift(1593,1);
- MS928X_Video_SetShift(sysVideoShift.u16HShift, sysVideoShift.u16VShift);
- //PRINT("u16HShift:%05d, u16VShift:%05d\n", sysVideoShift.u16HShift, sysVideoShift.u16VShift);
- }
- }
- else {
- //WDT_EN();
- //WDT_CLR();
- }
- //PRINT("MS928X Poll status:0x%x\n", u8status);
- //PRINT("u16HShift:%05d, u16VShift:%05d\n", sysVideoShift.u16HShift, sysVideoShift.u16VShift);
- }
- bool GetHVPixel(UINT8* HVPixelData)
- {
- UINT8 buf[10];
- bsp_param_read(buf, HV_PIXEL_ADDR, HV_PIXEL_LEN); //从flash读出来,len = 4 + 4
- if(buf[0] == 0xAA && buf[1] == 0x55 && buf[2] == 0xAA && buf[3] == 0x55) //if flag is right
- {
- memcpy(HVPixelData, &buf[4], 4); //return 4 bytes HV Pixel
- return TRUE;
- }
- memset(HVPixelData, 0, 4); //if flag is wrong, clear HV Pixel
- return FALSE;
- }
- bool StoreHVPixel(UINT8* HVPixelData)
- {
- u8 buf[8];
- buf[0] = 0xAA;
- buf[1] = 0x55;
- buf[2] = 0xAA;
- buf[3] = 0x55;
- //DataFlash_BlockErase(HV_PIXEL_ADDR); //erase a block
- //DataFlash_WriteDW(HV_PIXEL_ADDR, 0xAA55AA55); //write 0xAA55AA55
- memcpy(&buf[4], HVPixelData, 4); //copy 4 bytes HV Pixel to buf
- //DataFlash_Write((PUINT8)HV_PIXEL_ADDR + 4, (PUINT8)buf, HV_PIXEL_LEN); //接着第4位开始写HV Pixel,len = 4
- bsp_param_write(buf, HV_PIXEL_ADDR, HV_PIXEL_LEN);
- bsp_param_sync();
- return GetHVPixel(HVPixelData); //judge and return HV Pixel
- }
- static UINT16 MS928x_ProcessEvent( UINT8 task_id, UINT16 events )
- {
- if(events & MS_SERVICE)
- {
- MS928XService();
- events ^= MS_SERVICE;
- tmos_start_task(MS928xTaskId, MS_SERVICE, PERIO_100ms );
- goto OUT_FUMC;
- }
- if(events & HID_DEBUG_EVT)
- {
- CommandHandle();
- events ^= HID_DEBUG_EVT;
- tmos_set_event(MS928xTaskId, HID_DEBUG_EVT);
- goto OUT_FUMC;
- }
- return 0;
- OUT_FUMC:
- return events;
- }
- /******************************** endfile @ MS928x_mpi ******************************/
|