Module17: added support for hardware revision 1.0

This commit is contained in:
Morgan Diepart 2024-02-10 21:37:44 +01:00 committed by Silvano Seva
parent bd93d9429b
commit 30e9311a20
6 changed files with 178 additions and 45 deletions

View File

@ -122,7 +122,8 @@ const char *info_items[] =
{ {
"", "",
"Used heap", "Used heap",
"Hw Version" "Hw Version",
"HMI",
}; };
const char *authors[] = const char *authors[] =

View File

@ -28,6 +28,7 @@
#include <interfaces/platform.h> #include <interfaces/platform.h>
#include <interfaces/delays.h> #include <interfaces/delays.h>
#include <memory_profiling.h> #include <memory_profiling.h>
#include <hwconfig.h>
/* UI main screen helper functions, their implementation is in "ui_main.c" */ /* UI main screen helper functions, their implementation is in "ui_main.c" */
extern void _ui_drawMainBottom(); extern void _ui_drawMainBottom();
@ -49,7 +50,14 @@ const char *phase_values[] =
const char *hwVersions[] = const char *hwVersions[] =
{ {
"0.1d", "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)) 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 case 1: // Heap usage
snprintf(buf, max_len, "%dB", getHeapSize() - getCurrentFreeHeap()); snprintf(buf, max_len, "%dB", getHeapSize() - getCurrentFreeHeap());
break; break;
case 2: // LCD Type case 2: // HW Revision
snprintf(buf, max_len, "%s", hwVersions[hwinfo->hw_version]); 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; break;
} }
return 0; return 0;

View File

@ -25,15 +25,39 @@
#include <interfaces/keyboard.h> #include <interfaces/keyboard.h>
#include <interfaces/platform.h> #include <interfaces/platform.h>
#include <hwconfig.h> #include <hwconfig.h>
#include <i2c_stm32.h>
#include "cap1206.h"
static bool hmiConnected = false;
void kbd_init() void kbd_init()
{ {
gpio_setMode(ESC_SW, INPUT); const hwInfo_t *hwinfo = platform_getHwInfo();
gpio_setMode(ENTER_SW, INPUT); if(((hwinfo->flags & MOD17_FLAGS_HMI_PRESENT) != 0) &&
gpio_setMode(LEFT_SW, INPUT); ((hwinfo->hw_version >> 8) == MOD17_HMI_V10))
gpio_setMode(RIGHT_SW, INPUT); {
gpio_setMode(UP_SW, INPUT); /* Bring up the I2C2 interface for the touch controller on HMI */
gpio_setMode(DOWN_SW, INPUT); 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() void kbd_terminate()
@ -45,12 +69,28 @@ keyboard_t kbd_getKeys()
{ {
keyboard_t keys = 0; keyboard_t keys = 0;
if(gpio_readPin(ENTER_SW) == 1) keys |= KEY_ENTER; if(hmiConnected)
if(gpio_readPin(ESC_SW) == 1) keys |= KEY_ESC; {
if(gpio_readPin(LEFT_SW) == 1) keys |= KEY_LEFT; int resp = cap1206_readkeys(&i2c2);
if(gpio_readPin(RIGHT_SW) == 1) keys |= KEY_RIGHT; if(resp < 0)
if(gpio_readPin(UP_SW) == 1) keys |= KEY_UP; return 0;
if(gpio_readPin(DOWN_SW) == 1) keys |= KEY_DOWN;
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; return keys;
} }

View File

@ -24,14 +24,44 @@
#include <peripherals/i2c.h> #include <peripherals/i2c.h>
#include <stm32f4xx.h> #include <stm32f4xx.h>
#include <stdint.h>
#include <stdbool.h>
#include "pinmap.h" #include "pinmap.h"
enum AdcChannel enum AdcChannel
{ {
ADC_HWVER_CH = 3, ADC_HWVER_CH = 3,
ADC_HMI_HWVER_CH = 13,
}; };
extern const struct i2cDevice i2c1; 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 */ /* Screen dimensions */
#define CONFIG_SCREEN_WIDTH 128 #define CONFIG_SCREEN_WIDTH 128

View File

@ -24,9 +24,9 @@
#include <stm32f4xx.h> #include <stm32f4xx.h>
/* Signalling LEDs */ /* Signalling LEDs */
#define PTT_LED GPIOC,8 #define PTT_LED GPIOC,8
#define SYNC_LED GPIOC,9 #define SYNC_LED GPIOC,9
#define ERR_LED GPIOA,8 #define ERR_LED GPIOA,8
/* Display */ /* Display */
#define LCD_RST GPIOC,7 #define LCD_RST GPIOC,7
@ -38,32 +38,37 @@
//#define LCD_BKLIGHT GPIOE,15 //#define LCD_BKLIGHT GPIOE,15
/* Keyboard */ /* Keyboard */
#define ESC_SW GPIOB,8 #define ESC_SW GPIOB,8
#define RIGHT_SW GPIOB,11 #define RIGHT_SW GPIOB,11
#define UP_SW GPIOB,10 #define UP_SW GPIOB,10
#define DOWN_SW GPIOC,2 #define DOWN_SW GPIOC,2
#define LEFT_SW GPIOC,3 #define LEFT_SW GPIOC,3
#define ENTER_SW GPIOB,12 #define ENTER_SW GPIOB,12
#define PTT_SW GPIOC,13 #define HMI_SMCLK UP_SW
#define PTT_OUT GPIOD,2 #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 */ /* Audio */
#define AUDIO_MIC GPIOA,2 #define AUDIO_MIC GPIOA,2
#define AUDIO_SPK GPIOA,5 #define AUDIO_SPK GPIOA,5
#define BASEBAND_RX GPIOA,1 #define BASEBAND_RX GPIOA,1
#define BASEBAND_TX GPIOA,4 #define BASEBAND_TX GPIOA,4
#define SPK_MUTE GPIOB,1 #define SPK_MUTE GPIOB,1
#define MIC_MUTE GPIOC,4 #define MIC_MUTE GPIOC,4
#define MIC_GAIN GPIOC,5 #define MIC_GAIN GPIOC,5
#define AIN_HWVER GPIOA,3 #define AIN_HWVER GPIOA,3
#define POWER_SW GPIOA,15 #define POWER_SW GPIOA,15
/* I2C for MCP4551 */ /* I2C for MCP4551 */
#define I2C1_SDA GPIOB,7 #define I2C1_SDA GPIOB,7
#define I2C1_SCL GPIOB,6 #define I2C1_SCL GPIOB,6
#define SOFTPOT_RX 0x2E #define SOFTPOT_RX 0x2E
#define SOFTPOT_TX 0x2F #define SOFTPOT_TX 0x2F
#endif /* PINMAP_H */ #endif /* PINMAP_H */

View File

@ -34,6 +34,7 @@
ADC_STM32_DEVICE_DEFINE(adc1, ADC1, NULL, 3300000) ADC_STM32_DEVICE_DEFINE(adc1, ADC1, NULL, 3300000)
I2C_STM32_DEVICE_DEFINE(i2c1, I2C1, NULL) I2C_STM32_DEVICE_DEFINE(i2c1, I2C1, NULL)
I2C_STM32_DEVICE_DEFINE(i2c2, I2C2, NULL)
extern mod17Calib_t mod17CalData; extern mod17Calib_t mod17CalData;
@ -46,6 +47,7 @@ static hwInfo_t hwInfo =
.uhf_minFreq = 0, .uhf_minFreq = 0,
.uhf_band = 0, .uhf_band = 0,
.hw_version = 0, .hw_version = 0,
.flags = 0,
.name = "Module17" .name = "Module17"
}; };
@ -68,9 +70,12 @@ void platform_init()
/* /*
* Check if external I2C1 pull-ups are present. If they are not, * Check if external I2C1 pull-ups are present. If they are not,
* enable internal pull-ups and slow-down I2C1. * 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_SCL, INPUT_PULL_DOWN);
gpio_setMode(I2C1_SDA, INPUT_PULL_DOWN); gpio_setMode(I2C1_SDA, INPUT_PULL_DOWN);
delayUs(100);
uint8_t i2cSpeed = I2C_SPEED_100kHz; uint8_t i2cSpeed = I2C_SPEED_100kHz;
bool i2cPullups = gpio_readPin(I2C1_SCL) bool i2cPullups = gpio_readPin(I2C1_SCL)
@ -114,10 +119,44 @@ void platform_init()
* Hardware version is set using a voltage divider on PA3. * Hardware version is set using a voltage divider on PA3.
* - 0V: rev. 0.1d or lower * - 0V: rev. 0.1d or lower
* - 3.3V: rev 0.1e * - 3.3V: rev 0.1e
* - 1.65V: rev 1.0
*/ */
uint32_t ver = adc_getVoltage(&adc1, ADC_HWVER_CH); uint32_t ver = adc_getVoltage(&adc1, ADC_HWVER_CH);
if(ver >= 3000000) if(ver <= (MOD17_HW01D_VOLTAGE + MOD17_HWDET_THRESH))
hwInfo.hw_version = 1; {
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 */ /* 100ms blink of sync led to signal device startup */
gpio_setPin(SYNC_LED); gpio_setPin(SYNC_LED);