diff --git a/openrtx/src/ui/module17/ui.c b/openrtx/src/ui/module17/ui.c index 3fcd5aa9..13788ad1 100644 --- a/openrtx/src/ui/module17/ui.c +++ b/openrtx/src/ui/module17/ui.c @@ -122,7 +122,8 @@ const char *info_items[] = { "", "Used heap", - "Hw Version" + "Hw Version", + "HMI", }; const char *authors[] = diff --git a/openrtx/src/ui/module17/ui_menu.c b/openrtx/src/ui/module17/ui_menu.c index 79110131..d7f8ecb3 100644 --- a/openrtx/src/ui/module17/ui_menu.c +++ b/openrtx/src/ui/module17/ui_menu.c @@ -28,6 +28,7 @@ #include #include #include +#include /* UI main screen helper functions, their implementation is in "ui_main.c" */ extern void _ui_drawMainBottom(); @@ -49,7 +50,14 @@ const char *phase_values[] = const char *hwVersions[] = { "0.1d", - "0.1e" + "0.1e", + "1.0" +}; + +const char *hmiVersions[] = +{ + "None", + "1.0" }; void _ui_drawMenuList(uint8_t selected, int (*getCurrentEntry)(char *buf, uint8_t max_len, uint8_t index)) @@ -282,8 +290,18 @@ int _ui_getInfoValueName(char *buf, uint8_t max_len, uint8_t index) case 1: // Heap usage snprintf(buf, max_len, "%dB", getHeapSize() - getCurrentFreeHeap()); break; - case 2: // LCD Type - snprintf(buf, max_len, "%s", hwVersions[hwinfo->hw_version]); + case 2: // HW Revision + snprintf(buf, max_len, "%s", hwVersions[hwinfo->hw_version & 0xFF]); + break; + case 3: // HMI Version + #ifdef PLATFORM_LINUX + snprintf(buf, max_len, "%s", "Linux"); + #else + if(hwinfo->flags & MOD17_FLAGS_HMI_PRESENT) + snprintf(buf, max_len, "%s", hmiVersions[(hwinfo->hw_version >> 8) & 0xFF]); + else + snprintf(buf, max_len, "%s", hmiVersions[0]); + #endif break; } return 0; diff --git a/platform/drivers/keyboard/keyboard_Mod17.c b/platform/drivers/keyboard/keyboard_Mod17.c index 2453922e..de5236d3 100644 --- a/platform/drivers/keyboard/keyboard_Mod17.c +++ b/platform/drivers/keyboard/keyboard_Mod17.c @@ -25,15 +25,39 @@ #include #include #include +#include +#include "cap1206.h" + + +static bool hmiConnected = false; + void kbd_init() { - gpio_setMode(ESC_SW, INPUT); - gpio_setMode(ENTER_SW, INPUT); - gpio_setMode(LEFT_SW, INPUT); - gpio_setMode(RIGHT_SW, INPUT); - gpio_setMode(UP_SW, INPUT); - gpio_setMode(DOWN_SW, INPUT); + const hwInfo_t *hwinfo = platform_getHwInfo(); + if(((hwinfo->flags & MOD17_FLAGS_HMI_PRESENT) != 0) && + ((hwinfo->hw_version >> 8) == MOD17_HMI_V10)) + { + /* Bring up the I2C2 interface for the touch controller on HMI */ + gpio_setMode(HMI_SMCLK, ALTERNATE_OD | ALTERNATE_FUNC(4)); + gpio_setMode(HMI_SMDATA, ALTERNATE_OD | ALTERNATE_FUNC(4)); + gpio_setOutputSpeed(HMI_SMCLK, HIGH); + gpio_setOutputSpeed(HMI_SMDATA, HIGH); + + i2c_init(&i2c2, I2C_SPEED_100kHz); + cap1206_init(&i2c2); + + hmiConnected = true; + } + else + { + gpio_setMode(ESC_SW, INPUT); + gpio_setMode(ENTER_SW, INPUT); + gpio_setMode(LEFT_SW, INPUT); + gpio_setMode(RIGHT_SW, INPUT); + gpio_setMode(UP_SW, INPUT); + gpio_setMode(DOWN_SW, INPUT); + } } void kbd_terminate() @@ -45,12 +69,28 @@ keyboard_t kbd_getKeys() { keyboard_t keys = 0; - if(gpio_readPin(ENTER_SW) == 1) keys |= KEY_ENTER; - if(gpio_readPin(ESC_SW) == 1) keys |= KEY_ESC; - if(gpio_readPin(LEFT_SW) == 1) keys |= KEY_LEFT; - if(gpio_readPin(RIGHT_SW) == 1) keys |= KEY_RIGHT; - if(gpio_readPin(UP_SW) == 1) keys |= KEY_UP; - if(gpio_readPin(DOWN_SW) == 1) keys |= KEY_DOWN; + if(hmiConnected) + { + int resp = cap1206_readkeys(&i2c2); + if(resp < 0) + return 0; + + if(resp & 1) keys |= KEY_LEFT; // CS1 + if(resp & 2) keys |= KEY_DOWN; // CS2 + if(resp & 4) keys |= KEY_RIGHT; // CS3 + if(resp & 8) keys |= KEY_ENTER; // CS4 + if(resp & 16) keys |= KEY_UP; // CS5 + if(resp & 32) keys |= KEY_ESC; // CS6 + } + else + { + if(gpio_readPin(ENTER_SW) == 1) keys |= KEY_ENTER; + if(gpio_readPin(ESC_SW) == 1) keys |= KEY_ESC; + if(gpio_readPin(LEFT_SW) == 1) keys |= KEY_LEFT; + if(gpio_readPin(RIGHT_SW) == 1) keys |= KEY_RIGHT; + if(gpio_readPin(UP_SW) == 1) keys |= KEY_UP; + if(gpio_readPin(DOWN_SW) == 1) keys |= KEY_DOWN; + } return keys; } diff --git a/platform/targets/Module17/hwconfig.h b/platform/targets/Module17/hwconfig.h index 49f128d1..3bc02339 100644 --- a/platform/targets/Module17/hwconfig.h +++ b/platform/targets/Module17/hwconfig.h @@ -24,14 +24,44 @@ #include #include +#include +#include #include "pinmap.h" enum AdcChannel { - ADC_HWVER_CH = 3, + ADC_HWVER_CH = 3, + ADC_HMI_HWVER_CH = 13, }; extern const struct i2cDevice i2c1; +extern const struct i2cDevice i2c2; + +enum Mod17HwVersion +{ + MOD17_HW_V01_D = 0, /* Hardware version 0.1d */ + MOD17_HW_V01_E = 1, /* Hardware version 0.1e */ + MOD17_HW_V10 = 2 /* Hardware version 1.0 */ +}; + +enum Mod17HmiVersion +{ + MOD17_HMI_V10 = 1 /* HMI hardware ver. 1.0 */ +}; + +enum Mod17Flags +{ + MOD17_FLAGS_HMI_PRESENT = 1 +}; + +#define MOD17_HWDET_THRESH 300000 /* Threshold for hardware detection, in uV */ + +#define MOD17_HW01D_VOLTAGE 0 /* Hardware version 0.1d: gpio pulled to 0V */ +#define MOD17_HW01E_VOLTAGE 3300000 /* Hardware version 0.1e: gpio pulled to 3.3V */ +#define MOD17_HW10_VOLTAGE 1650000 /* Hardware version 1.0: gpio pulled to 1.65V */ + +#define MOD17_HMI10_VOLTAGE 1688000 /* HMI version 1.0: gpio pulled to 1.68V */ + /* Screen dimensions */ #define CONFIG_SCREEN_WIDTH 128 diff --git a/platform/targets/Module17/pinmap.h b/platform/targets/Module17/pinmap.h index dbad8e43..3d408d56 100644 --- a/platform/targets/Module17/pinmap.h +++ b/platform/targets/Module17/pinmap.h @@ -24,9 +24,9 @@ #include /* Signalling LEDs */ -#define PTT_LED GPIOC,8 -#define SYNC_LED GPIOC,9 -#define ERR_LED GPIOA,8 +#define PTT_LED GPIOC,8 +#define SYNC_LED GPIOC,9 +#define ERR_LED GPIOA,8 /* Display */ #define LCD_RST GPIOC,7 @@ -38,32 +38,37 @@ //#define LCD_BKLIGHT GPIOE,15 /* Keyboard */ -#define ESC_SW GPIOB,8 -#define RIGHT_SW GPIOB,11 -#define UP_SW GPIOB,10 -#define DOWN_SW GPIOC,2 -#define LEFT_SW GPIOC,3 -#define ENTER_SW GPIOB,12 +#define ESC_SW GPIOB,8 +#define RIGHT_SW GPIOB,11 +#define UP_SW GPIOB,10 +#define DOWN_SW GPIOC,2 +#define LEFT_SW GPIOC,3 +#define ENTER_SW GPIOB,12 -#define PTT_SW GPIOC,13 -#define PTT_OUT GPIOD,2 +#define HMI_SMCLK UP_SW +#define HMI_SMDATA RIGHT_SW +#define HMI_SMBA ENTER_SW +#define HMI_AIN_HWVER LEFT_SW + +#define PTT_SW GPIOC,13 +#define PTT_OUT GPIOD,2 /* Audio */ -#define AUDIO_MIC GPIOA,2 -#define AUDIO_SPK GPIOA,5 -#define BASEBAND_RX GPIOA,1 -#define BASEBAND_TX GPIOA,4 -#define SPK_MUTE GPIOB,1 -#define MIC_MUTE GPIOC,4 -#define MIC_GAIN GPIOC,5 +#define AUDIO_MIC GPIOA,2 +#define AUDIO_SPK GPIOA,5 +#define BASEBAND_RX GPIOA,1 +#define BASEBAND_TX GPIOA,4 +#define SPK_MUTE GPIOB,1 +#define MIC_MUTE GPIOC,4 +#define MIC_GAIN GPIOC,5 -#define AIN_HWVER GPIOA,3 -#define POWER_SW GPIOA,15 +#define AIN_HWVER GPIOA,3 +#define POWER_SW GPIOA,15 /* I2C for MCP4551 */ -#define I2C1_SDA GPIOB,7 -#define I2C1_SCL GPIOB,6 -#define SOFTPOT_RX 0x2E -#define SOFTPOT_TX 0x2F +#define I2C1_SDA GPIOB,7 +#define I2C1_SCL GPIOB,6 +#define SOFTPOT_RX 0x2E +#define SOFTPOT_TX 0x2F -#endif /* PINMAP_H */ +#endif /* PINMAP_H */ \ No newline at end of file diff --git a/platform/targets/Module17/platform.c b/platform/targets/Module17/platform.c index 8cafe7bb..1cb3a1fd 100644 --- a/platform/targets/Module17/platform.c +++ b/platform/targets/Module17/platform.c @@ -34,6 +34,7 @@ ADC_STM32_DEVICE_DEFINE(adc1, ADC1, NULL, 3300000) I2C_STM32_DEVICE_DEFINE(i2c1, I2C1, NULL) +I2C_STM32_DEVICE_DEFINE(i2c2, I2C2, NULL) extern mod17Calib_t mod17CalData; @@ -46,6 +47,7 @@ static hwInfo_t hwInfo = .uhf_minFreq = 0, .uhf_band = 0, .hw_version = 0, + .flags = 0, .name = "Module17" }; @@ -68,9 +70,12 @@ void platform_init() /* * Check if external I2C1 pull-ups are present. If they are not, * enable internal pull-ups and slow-down I2C1. - */ + * The sequence of operation have to be respected otherwise the + * I2C peripheral might report as continuously busy. + */ gpio_setMode(I2C1_SCL, INPUT_PULL_DOWN); gpio_setMode(I2C1_SDA, INPUT_PULL_DOWN); + delayUs(100); uint8_t i2cSpeed = I2C_SPEED_100kHz; bool i2cPullups = gpio_readPin(I2C1_SCL) @@ -114,10 +119,44 @@ void platform_init() * Hardware version is set using a voltage divider on PA3. * - 0V: rev. 0.1d or lower * - 3.3V: rev 0.1e + * - 1.65V: rev 1.0 */ uint32_t ver = adc_getVoltage(&adc1, ADC_HWVER_CH); - if(ver >= 3000000) - hwInfo.hw_version = 1; + if(ver <= (MOD17_HW01D_VOLTAGE + MOD17_HWDET_THRESH)) + { + hwInfo.hw_version = MOD17_HW_V01_D; + } + else if(ver >= (MOD17_HW01E_VOLTAGE - MOD17_HWDET_THRESH)) + { + hwInfo.hw_version = MOD17_HW_V01_E; + } + else if((ver >= (MOD17_HW10_VOLTAGE - MOD17_HWDET_THRESH)) && + (ver <= (MOD17_HW10_VOLTAGE + MOD17_HWDET_THRESH))) + { + hwInfo.hw_version = MOD17_HW_V10; + + /* + * Determine if HMI is connected by checking if the I2C pull-up + * resistors are present + */ + i2cPullups = gpio_readPin(HMI_SMCLK) + & gpio_readPin(HMI_SMDATA); + + if(i2cPullups) + { + hwInfo.flags |= MOD17_FLAGS_HMI_PRESENT; + + /* Determine HMI hardware version */ + gpio_setMode(HMI_AIN_HWVER, ANALOG); + ver = adc_getVoltage(&adc1, ADC_HMI_HWVER_CH); + + if((ver >= (MOD17_HMI10_VOLTAGE - MOD17_HWDET_THRESH)) && + (ver <= (MOD17_HMI10_VOLTAGE + MOD17_HWDET_THRESH))) + { + hwInfo.hw_version |= (MOD17_HMI_V10 << 8); + } + } + } /* 100ms blink of sync led to signal device startup */ gpio_setPin(SYNC_LED);