kopia lustrzana https://github.com/OpenRTX/OpenRTX
Module17: added support for hardware revision 1.0
rodzic
bd93d9429b
commit
30e9311a20
|
@ -122,7 +122,8 @@ const char *info_items[] =
|
|||
{
|
||||
"",
|
||||
"Used heap",
|
||||
"Hw Version"
|
||||
"Hw Version",
|
||||
"HMI",
|
||||
};
|
||||
|
||||
const char *authors[] =
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
|
@ -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);
|
||||
|
|
Ładowanie…
Reference in New Issue