From d2fca8f021ea9ea7fd52dde371d7ed884f6029f7 Mon Sep 17 00:00:00 2001 From: Frank Li Date: Fri, 20 Jul 2018 10:49:29 -0500 Subject: [PATCH] Support i.MX 815 chip Signed-off-by: Frank Li --- libuuu/config.cpp | 1 + libuuu/hidreport.h | 5 +++++ libuuu/rominfo.cpp | 5 +++-- libuuu/rominfo.h | 1 + libuuu/sdps.cpp | 26 ++++++++++++++++++-------- libuuu/trans.cpp | 33 ++++++++++++++++++++++++--------- libuuu/trans.h | 4 +++- 7 files changed, 55 insertions(+), 20 deletions(-) diff --git a/libuuu/config.cpp b/libuuu/config.cpp index e54bb32c..309126dd 100644 --- a/libuuu/config.cpp +++ b/libuuu/config.cpp @@ -44,6 +44,7 @@ Config::Config() push_back(ConfigItem("SDPS:", "MX8QXP", NULL, NXP_VID, 0x012F, 0x0002)); push_back(ConfigItem("SDPS:", "MX8QM", "MX8QXP", NXP_VID, 0x0129, 0x0002)); push_back(ConfigItem("SDPS:", "MX28", NULL, FSL_VID, 0x004f)); + push_back(ConfigItem("SDPS:", "MX815", NULL, NXP_VID, 0x013E)); push_back(ConfigItem("SDP:", "MX7D", NULL, FSL_VID, 0x0076)); push_back(ConfigItem("SDP:", "MX6Q", NULL, FSL_VID, 0x0054)); push_back(ConfigItem("SDP:", "MX6D", "MX6Q", FSL_VID, 0x0061)); diff --git a/libuuu/hidreport.h b/libuuu/hidreport.h index 1536efa3..9afa1b1f 100644 --- a/libuuu/hidreport.h +++ b/libuuu/hidreport.h @@ -74,6 +74,11 @@ class HIDReport m_out_buff.resize(m_size_out + m_size_payload); m_skip_notify = true; } + void set_out_package_size(int sz) + { + m_size_out = sz; + m_out_buff.resize(m_size_out + m_size_payload); + } HIDReport() { init(); diff --git a/libuuu/rominfo.cpp b/libuuu/rominfo.cpp index 243efe5b..524bdd5c 100644 --- a/libuuu/rominfo.cpp +++ b/libuuu/rominfo.cpp @@ -51,7 +51,8 @@ ROM_INFO g_RomInfo[] = { "MX7ULP", 0x2f018000, ROM_INFO_HID | ROM_INFO_HID_MX6 | ROM_INFO_HID_SKIP_DCD }, { "MXRT106X", 0x1000, ROM_INFO_HID | ROM_INFO_HID_MX6 | ROM_INFO_HID_SKIP_DCD }, { "MX8QXP", 0x0, ROM_INFO_HID | ROM_INFO_HID_NO_CMD | ROM_INFO_HID_UID_STRING }, - { "MX28", 0x0, ROM_INFO_HID}, + { "MX28", 0x0, ROM_INFO_HID}, + { "MX815", 0x0, ROM_INFO_HID | ROM_INFO_HID_NO_CMD | ROM_INFO_HID_UID_STRING | ROM_INFO_HID_EP1 | ROM_INFO_HID_PACK_SIZE_1020 }, { "SPL", 0x0, ROM_INFO_HID | ROM_INFO_HID_MX6 | ROM_INFO_SPL_JUMP }, { "SPL1", 0x0, ROM_INFO_HID | ROM_INFO_HID_MX6 | ROM_INFO_SPL_JUMP | ROM_INFO_AUTO_SCAN_UBOOT_POS}, }; @@ -144,4 +145,4 @@ size_t GetContainerActualSize(shared_ptr p, size_t offset) hdr = (struct rom_container *)(p->data() + offset + sz); return sz; -} \ No newline at end of file +} diff --git a/libuuu/rominfo.h b/libuuu/rominfo.h index cfbc2bec..e9cdd1af 100644 --- a/libuuu/rominfo.h +++ b/libuuu/rominfo.h @@ -43,6 +43,7 @@ #define ROM_INFO_HID_NO_CMD 0x400 #define ROM_INFO_SPL_JUMP 0x800 #define ROM_INFO_HID_EP1 0x1000 +#define ROM_INFO_HID_PACK_SIZE_1020 0x2000 #include #include diff --git a/libuuu/sdps.cpp b/libuuu/sdps.cpp index fce0e6c6..b7c0114c 100644 --- a/libuuu/sdps.cpp +++ b/libuuu/sdps.cpp @@ -75,9 +75,24 @@ struct _ST_HID_CBW #pragma pack () +#include "rominfo.h" + int SDPSCmd::run(CmdCtx *pro) { + ROM_INFO * rom; + rom = search_rom_info(pro->m_config_item); + if (rom == NULL) + { + string_ex err; + err.format("%s:%d can't get rom info", __FUNCTION__, __LINE__); + set_last_err_string(err); + return -1; + } + HIDTrans dev; + if (rom->flags & ROM_INFO_HID_EP1) + dev.set_hid_out_ep(1); + if(dev.open(pro->m_dev)) return -1; @@ -85,14 +100,6 @@ int SDPSCmd::run(CmdCtx *pro) if (!p) return -1; - ROM_INFO * rom; - rom = search_rom_info(pro->m_config_item); - if (rom == NULL) - { - set_last_err_string("Fail found ROM info"); - return -1; - } - HIDReport report(&dev); report.m_skip_notify = false; @@ -123,6 +130,9 @@ int SDPSCmd::run(CmdCtx *pro) return ret; } + if (rom->flags & ROM_INFO_HID_PACK_SIZE_1020) + report.set_out_package_size(1020); + int ret = report.write(p->data() + m_offset, sz, 2); if (ret == 0) diff --git a/libuuu/trans.cpp b/libuuu/trans.cpp index ddd233a8..403857a2 100644 --- a/libuuu/trans.cpp +++ b/libuuu/trans.cpp @@ -90,16 +90,31 @@ int HIDTrans::write(void *buff, size_t size) { int ret; uint8_t *p = (uint8_t *)buff; - ret = libusb_control_transfer( - (libusb_device_handle *)m_devhandle, - LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE, - m_set_report, - (2 << 8) | p[0], - 0, - p, - size, - 1000 + int actual_size; + if (m_outEP) + { + ret = libusb_interrupt_transfer( + (libusb_device_handle *)m_devhandle, + m_outEP, + p, + size, + &actual_size, + 1000 ); + } + else + { + ret = libusb_control_transfer( + (libusb_device_handle *)m_devhandle, + LIBUSB_ENDPOINT_OUT | LIBUSB_REQUEST_TYPE_CLASS | LIBUSB_RECIPIENT_INTERFACE, + m_set_report, + (2 << 8) | p[0], + 0, + p, + size, + 1000 + ); + } if (ret < 0) { diff --git a/libuuu/trans.h b/libuuu/trans.h index ad2cb04b..221f5560 100644 --- a/libuuu/trans.h +++ b/libuuu/trans.h @@ -77,9 +77,11 @@ class USBTrans : public TransBase class HIDTrans : public USBTrans { int m_set_report; + int m_outEP; public: int m_read_timeout; - HIDTrans() { m_set_report = 9; m_read_timeout = 1000; } + HIDTrans() { m_set_report = 9; m_read_timeout = 1000; m_outEP = 0; } + void set_hid_out_ep(int ep) { m_outEP = ep; } ~HIDTrans() { if (m_devhandle) close(); m_devhandle = NULL; } int write(void *buff, size_t size); int read(void *buff, size_t size, size_t *return_size);