Module17: added support for hardware revision 1.0

pull/273/head
Morgan Diepart 2024-02-10 21:37:44 +01:00 zatwierdzone przez Silvano Seva
rodzic bd93d9429b
commit 30e9311a20
6 zmienionych plików z 178 dodań i 45 usunięć

Wyświetl plik

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

Wyświetl plik

@ -28,6 +28,7 @@
#include <interfaces/platform.h>
#include <interfaces/delays.h>
#include <memory_profiling.h>
#include <hwconfig.h>
/* 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;

Wyświetl plik

@ -25,15 +25,39 @@
#include <interfaces/keyboard.h>
#include <interfaces/platform.h>
#include <hwconfig.h>
#include <i2c_stm32.h>
#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;
}

Wyświetl plik

@ -24,14 +24,44 @@
#include <peripherals/i2c.h>
#include <stm32f4xx.h>
#include <stdint.h>
#include <stdbool.h>
#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

Wyświetl plik

@ -24,9 +24,9 @@
#include <stm32f4xx.h>
/* 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 */

Wyświetl plik

@ -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);