diff --git a/bin/factory_mode.py b/bin/factory_mode.py new file mode 100644 index 0000000..7dbb1a5 --- /dev/null +++ b/bin/factory_mode.py @@ -0,0 +1,176 @@ +import os +import sys +import struct +from bin.log import mywrite + + + + +_CmdTable={ + 0x0001:'IOT_FTM_CMD_ID_PING', + 0x0002:'IOT_FTM_CMD_ID_READ', + 0x0003:'IOT_FTM_CMD_ID_WRITE', + 0x0004:'IOT_FTM_CMD_ID_TX', + 0x0005:'IOT_FTM_CMD_ID_RX', + 0x0006:'IOT_FTM_CMD_ID_TONE', + 0x0007:'IOT_FTM_CMD_ID_STS', + 0x0008:'IOT_FTM_CMD_ID_SET', + 0x0009:'IOT_FTM_CMD_ID_GET', + 0x000a:'IOT_FTM_CMD_ID_SCAN', + 0X000b:'IOT_FTM_CMD_ID_HWQCFG', + 0X000c:'IOT_FTM_CMD_ID_PKTCFG', + 0X000d:'IOT_FTM_CMD_ID_TESTCASE', + 0X000e:'IOT_FTM_CMD_ID_MAC_RECE', + 0X000f:'IOT_FTM_CMD_ID_MAC_RECE_SNIFFER', + 0x0010:'IOT_FTM_CMD_ID_RINGCFG', + 0x0011:'IOT_FTM_CMD_ID_SET_FILTERSEL', + 0x0012:'IOT_FTM_CMD_ID_SET_FILTER', + 0x0013:'IOT_FTM_CMD_ID_SET_RINGDIS', + 0x0014:'IOT_FTM_CMD_ID_SNIFFERCFG', + 0x0015:'IOT_FTM_CMD_ID_RX_MSG_SHOW', + 0x0016:'IOT_FTM_CMD_ID_CMD_CFG', + 0x0017:'IOT_FTM_CMD_ID_CRC_CFG', + 0x0018:'IOT_FTM_CMD_ID_MAC_PING', + 0x0019:'IOT_FTM_CMD_ID_SET_TEINID', + 0x001A:'IOT_FTM_CMD_ID_CLEAR_COUNT', + 0x001B:'IOT_FTM_CMD_ID_SEND_COUNT', + 0x001C:'IOT_FTM_CMD_ID_TPUT_TEST', + 0x001D:'IOT_FTM_CMD_ID_DIS_HWQ', + 0x001E:'IOT_FTM_CMD_ID_LOAD_DATA', + 0x001F:'IOT_FTM_CMD_ID_I2C_WRITE', + 0x0020:'IOT_FTM_CMD_ID_I2C_READ', + 0x0021:'IOT_FTM_CMD_ID_GPIO_OUT', + 0x0022:'IOT_FTM_CMD_ID_GPIO_IN', + 0x0023:'IOT_FTM_CMD_ID_UART_LOOPBACK', + 0x0024:'IOT_FTM_CMD_ID_SPI_FLASH', + 0x0025:'IOT_FTM_CMD_ID_READ_CHIPID', + 0x0026:'IOT_FTM_CMD_ID_READ_FW_VER', + 0x0027:'IOT_FTM_CMD_ID_BURN_MAC', + 0x0028:'IOT_FTM_CMD_ID_SEND_REV_DATA', + 0x0029:'IOT_FTM_CMD_ID_GOLDEN_REV_DATA', + 0x002a:'IOT_FTM_CMD_ID_SET_PHY_PARA', + 0x002b:'IOT_FTM_CMD_ID_READ_MAC', + 0x002c:'IOT_FTM_CMD_ID_INIT_DONE', + 0x002d:'IOT_FTM_CMD_ID_EFUSE_LOCK', + 0x002e:'IOT_FTM_CMD_ID_SPUR_MASK_SET', + 0x002f:'IOT_FTM_CMD_ID_OEM_MODULETYPE_SET', + 0x0030:'IOT_FTM_CMD_ID_OEM_MODULETYPE_GET', + 0x0031:'IOT_FTM_CMD_ID_VENDOR_ID_SET', + 0x0032:'IOT_FTM_CMD_ID_CHIP_CODE_SET', + 0x0033:'IOT_FTM_CMD_ID_CHIP_CODE_GET', + 0x0034:'IOT_FTM_CMD_ID_SET_PPM_NID', + 0x0035:'IOT_FTM_CMD_ID_GLB_NID_SET', + 0x0036:'IOT_FTM_CMD_ID_CUS_CMD', + 0x0037:'IOT_FTM_CMD_ID_VENDOR_ID_GET', + 0x0038:'IOT_FTM_CMD_ID_CHIP_MMID_GET', + 0x0039:'IOT_FTM_CMD_ID_ZC_CIRCUIT_CHECK', + 0x003a:'IOT_FTM_CMD_ID_DISABEL_GPIO_RESET', + 0x003b:'IOT_FTM_CMD_ID_DUT_CHARGE_VOL_GET', + 0x003c:'IOT_FTM_CMD_ID_FW_CRC_CHECK', + 0x003d:'IOT_FTM_CMD_ID_DEV_ID_SET', + 0x003e:'IOT_FTM_CMD_ID_DEV_ID_GET', + 0x003f:'IOT_FTM_CMD_ID_PT_FW_VER_GET', + 0x0040:'IOT_FTM_CMD_ID_HW_VER_SET', + 0x0041:'IOT_FTM_CMD_ID_HW_VER_GET', + 0x0042:'IOT_FTM_CMD_ID_DUT_CHANNEL_VOL_GET', + 0x0043:'IOT_FTM_CMD_ID_DUT_TXRX_MODE_SET', + 0x0044:'IOT_FTM_CMD_ID_FLASH_ID_GET', + 0x0045:'IOT_FTM_CMD_ID_MAC_ADDR_UPDATE', + 0x0046:'IOT_FTM_CMD_ID_BURN_IP_INFO', + 0x0047:'IOT_FTM_CMD_ID_READ_IP_INFO', + 0x0048:'IOT_FTM_CMD_ID_CHIP_MMID_SET', + 0x0049:'IOT_FTM_CMD_ID_CHECK_IMG_CRC', + 0x004a:'IOT_FTM_CMD_ID_METER_CROSSTALK_SET', + 0x004b:'IOT_FTM_CMD_ID_METER_CROSSTALK_GET', + 0x004c:'IOT_FTM_CMD_ID_SOFT_RESTART', + 0x004d:'IOT_FTM_CMD_ID_EM_EXT_FUNC', + 0x004e:'IOT_FTM_CMD_ID_PASSCODE_GET', + 0x004f:'IOT_FTM_CMD_ID_EXT_FLASH_CHECK', + 0x0050:'IOT_FTM_CMD_ID_BRK_START_STOP_LOOPBACK', + 0x0051:'IOT_FTM_CMD_ID_BRK_ENABLE_INT', + 0x0052:'IOT_FTM_CMD_ID_BRK_QUERY_TRIGGER_CNT', + 0x0053:'IOT_FTM_CMD_ID_READ_BCD_MAC', + 0x0054:'IOT_FTM_CMD_ID_LOADER_TSFM', + 0x0055:'IOT_FTM_CMD_ID_CHANNEL_ADC_READ', + 0x0056:'IOT_FTM_CMD_ID_METER_PORT_UART_LOOPBACK', + 0x0057:'IOT_FTM_CMD_ID_SET_PT_FW_VER', + 0x0058:'IOT_FTM_CMD_ID_TEMP_CALI_SET', + 0x0059:'IOT_FTM_CMD_ID_TEMP_CALI_GET', + 0x005A:'IOT_FTM_CMD_ID_MAC_PHY_DIAGNOSTIC', + 0x005B:'IOT_FTM_CMD_ID_ADC_CALI_SET', + 0x005C:'IOT_FTM_CMD_ID_ADC_CALI_GET', + 0x005D:'IOT_FTM_CMD_ID_ADC_READ_REAL', + 0x005E:'IOT_FTM_CMD_ID_PHY_RF_TXIQM_CAL_W', + 0x005F:'IOT_FTM_CMD_ID_PHY_RF_TXIQM_CAL_R', + 0x0060:'IOT_FTM_CMD_ID_RF_PHY_TX_TONE', + 0x0061:'IOT_FTM_CMD_ID_RF_SPI_SYNC', + 0x0062:'IOT_FTM_CMD_ID_PHY_RF_TXF_CAL_W', + 0x0063:'IOT_FTM_CMD_ID_PHY_RF_TXF_CAL_R', + 0x0064:'IOT_FTM_CMD_ID_MP_RF_TEST', + 0x0065:'IOT_FTM_CMD_ID_RF_TRS_CHK', + 0x0066:'IOT_FTM_CMD_ID_EFUSE_CHECK', + 0x0067:'IOT_FTM_CMD_ID_MP_RF_CAL_CFG', + 0x0068:'IOT_FTM_CMD_ID_MP_RF_CAL_MEAS', + 0x0069:'IOT_FTM_CMD_ID_MP_RF_CAL_UPDATE', + 0x006A:'IOT_FTM_CMD_ID_POWER_SYNC', + 0x006B:'IOT_FTM_CMD_ID_SECURITY_CFG_SET', + 0x006C:'IOT_FTM_CMD_ID_SECURITY_CFG_GET', + 0x006D:'IOT_FTM_CMD_ID_RF_PHY_TX_TONE_RAW', + 0x006E:'IOT_FTM_CMD_ID_TOPO_ADC_DUMP', + 0x006F:'IOT_FTM_CMD_ID_IR_LOOPBACK_TEST', + 0x0070:'IOT_FTM_CMD_ID_RF_TX_DC_LOOP_CALI', + 0x0071:'IOT_FTM_CMD_ID_SET_GET_PT_INFO', + 0x0072:'IOT_FTM_CMD_ID_DUMP_TO_MEM', +} + + + + +def ftm_decode(data:bytearray): + # 跳过开头的6个字节 src mac 和6个字节 dst mac + data=data[12:] + # print(data) + hdr=struct.unpack("0: + index_start=data.find(b'##') + index_end=data.find(b'@@') + if(index_start>=0 and index_end>=0): + try: + s=data[:index_start] + txt=s.decode("utf-8") + mywrite(txt) + except Exception as e: + pass + ftm_decode(data[index_start+2:index_end]) + data=data[index_end+2:] + + +if __name__ == "__main__": + ftm_handle(bytearray.fromhex("2323000000000000000000000000030000004f0000000b0000004f00050005000910110f0d4040")) + ftm_handle(bytearray.fromhex("232300000000000000000000000004000000180000000200000024004040")) diff --git a/kunlun.py b/kunlun.py index 54afc94..412f061 100644 --- a/kunlun.py +++ b/kunlun.py @@ -20,6 +20,7 @@ from bin.bin_to_hex import bin_file_decrypt from bin.bin_to_hex import clear_tmp from bin.bin_to_hex import load_flash_info from bin.base import bin_path +from bin.factory_mode import ftm_handle def init_send(s_port:serial.Serial, send_str:str): @@ -182,6 +183,16 @@ def upload_bin(x_modem:xmodem.XMODEM, w_file): myprint (f"Receiving {w_file} result: {xmodem_send}, consuming time: {(time_stamp_end-time_stamp_start)} s ") +def recv_ser_data_ftm(s_port:serial.Serial,timeout:float=1): + recv_data=bytearray() + while timeout>0: + time.sleep(0.1) + timeout-=0.1 + bytes2read = s_port.in_waiting + if(bytes2read>0): + tmp = s_port.read(bytes2read) + recv_data+=tmp + ftm_handle(recv_data) def getc(size, timeout=1): @@ -342,6 +353,8 @@ def global_def(): elif(args.console is not None): iot_flash_file=args.console function_type='console' + elif(args.ftm): + function_type='ftm' @@ -362,6 +375,7 @@ def parser_init(): parser.add_argument('-i','--layout_index',action='store',type=int,help='解析接收到的flash文件或转换bin文件时使用的layout,不指定则不解析') parser.add_argument('--b_rate',action='store',type=int,default=115200,help='下载ram程序 上传flash数据 控制台 接收log等 使用的串口波特率') parser.add_argument('--nb_rate',action='store',type=int,default=1500000,help='下载flash程序使用的串口波特率') + parser.add_argument('--ftm',action='store_true',type=bool,default=False,help='进入工厂模式') @@ -412,6 +426,9 @@ if __name__ == '__main__': recv_ser_data(ser) read_input(ser) sys.exit(0) + if(function_type=="ftm"): + myprint("此功能尚未实现") + sys.exit(0) modem = xmodem.XMODEM(getc, putc, mode='xmodem1k') # 发送启动字符让设备进入xmodem模式 diff --git a/vscode_cpp_setting.py b/vscode_cpp_setting.py index b9e0630..89b9635 100644 --- a/vscode_cpp_setting.py +++ b/vscode_cpp_setting.py @@ -15,7 +15,7 @@ import time ''' # 定义配置文件路径 -_vscode_cfg_path=os.path.normpath(os.path.abspath('.')+'/../../../.vscode/c_cpp_properties.json') +_vscode_cfg_path=os.path.normpath(os.path.abspath(os.path.split(sys.argv[0])[0])+'/../../../.vscode/c_cpp_properties.json') # 定义编译日志路径 _build_log_path='build_log.log'