implemented reading sub MCU version number

This commit is contained in:
true 2024-10-28 00:24:16 -07:00
parent 092503c595
commit 1bc5289f4a
9 changed files with 80 additions and 19 deletions

View File

@ -30,7 +30,7 @@ individual MCU core bugs, quirks and omission are in each MCU's code directory.
- when removing from a badge, pulling on the nametag from the non-soldered-pin side can damage the addon. this was a known issue going into this project. with the help of tape and passing on knowledge I hope people don't destroy their addons.
- to fix this would be to design my own oled board that is attached at both sides strongly.
- ...but the intent was to have a kit to solder.
- ...but with how complicated this is, I am not sure it should be a kit. I dunno.f
- ...but with how complicated this is, I am not sure it should be a kit. I dunno.
- the GAT header was accidentally implemented mirrored. I always quadruple-check things like this but being rushed not only on this project but on several others means this still got missed.
- to fix this, future runs would have this redesigned.
- BLE may or may not ever work. it was a longshot dream when starting the project. if you want to get it working, solder a wire to the pad next to the "SUPERCON" text and give it a try... by writing the code to make it work, lol.

View File

@ -118,10 +118,6 @@ void ch32sub_init()
ch32sub_write_1b(REG_INTR_FLAGS_CLEAR, 0xff);
}
void ch32sub_rgb_hwen(uint8_t en)
{
ch32sub_write_1b(REG_RGB_HWEN, en);
}
void ch32sub_intr_defaults()
{
@ -140,3 +136,18 @@ void ch32sub_intr_defaults()
dat[0] = INT_BTN | INT_UTX_DONE | INT_UTX_TIMEOUT | INT_UTX_ERROR | INT_URX_RCVD;
ch32sub_write_1b(REG_INTR_ENABLE, dat[0]);
}
void ch32sub_set_rgb_hwen(uint8_t en)
{
ch32sub_write_1b(REG_RGB_HWEN, en);
}
uint16_t ch32sub_get_ver()
{
uint8_t dat[2];
ch32sub_read(REG_VER_HI, dat, 2);
return dat[0] << 8 | dat[1];
}

View File

@ -39,7 +39,8 @@
enum ch32sub_regmap {
// read-only
REG_INTR_FLAGS = 0x00,
REG_RSVD_01,
REG_VER_HI,
REG_VER_LO,
REG_BTN_PUSHED_LATCHED, // buttons currently pushed.
REG_BTN_PUSHED, // buttons pushed. reading will clear this value.
REG_BTN_HELD, // buttons currently being held. reading will clear this value.
@ -49,7 +50,6 @@ enum ch32sub_regmap {
REG_BTN3_MASK,
REG_BTN4_MASK,
REG_BTN5_MASK,
REG_WERR_HI = 0x0c, // write error count, high byte
REG_WERR_LO, // write error count, low byte
REG_IRDA_READ_HI, // IrDA read packet length, hi byte (currently always 0)
@ -113,7 +113,11 @@ void ch32sub_write(uint16_t reg, uint8_t *dat, uint8_t len);
void ch32sub_write_1b(uint16_t reg, uint8_t dat);
void ch32sub_intr_defaults();
void ch32sub_rgb_hwen(uint8_t en);
void ch32sub_set_rgb_hwen(uint8_t en);
uint16_t ch32sub_get_ver();

View File

@ -67,7 +67,7 @@
const uint8_t vers[] = "241026b";
const uint8_t vers[] = "241028a";
uint32_t cpu_use = 0;
uint32_t cpu_max = 0;
@ -296,7 +296,7 @@ void lowprio_task() {
flags_lo &= ~FLAG_CH32V_RESEND_CONF;
ch32sub_intr_defaults();
btn_commit_hold();
ch32sub_rgb_hwen(1);
ch32sub_set_rgb_hwen(1);
} else {
// send button holds any time the orientation of the OLED changes
if (sysflags & SYS_OLED_ROTATE_CHANGED) {
@ -377,7 +377,7 @@ int main()
uconf_load(); // read the user config
ch32sub_init(); // initialize aux MCU
ch32sub_rgb_hwen(1); // and enable RGBLED controller hardware pin so the controller can wake up
ch32sub_set_rgb_hwen(1); // and enable RGBLED controller hardware pin so the controller can wake up
tinymt32_init(&tinymt32_s, 1337); // let's get random

View File

@ -35,7 +35,7 @@
#define LI_ACCELEROMETER 5
#define LI_CPU_USAGE 6
#define LI_MISC_STATS 7
#define LI_ERROR_COUNTERS 8
#define LI_OTHER_INFO 8
#define LI_FONT_GLYPH_TEST 9
@ -116,6 +116,7 @@ __HIGH_CODE
void menu_6_disp(uint8_t idx)
{
uint8_t i;
uint16_t ver;
char txt[30];
const uint8_t led_pos[4][2] = {
@ -289,9 +290,9 @@ void menu_6_disp(uint8_t idx)
break;
}
case LI_ERROR_COUNTERS: { // error counters
case LI_OTHER_INFO: { // was error counters
ssd1306fb_set_cursor(10, -1);
ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, "Error Counters", 1);
ssd1306fb_draw_str(font_DejaVu_Sans_Mono_Bold_11, "Other Info", 1);
/*
ssd1306fb_set_cursor(10, 10);
@ -311,6 +312,16 @@ void menu_6_disp(uint8_t idx)
ssd1306fb_draw_str(font_Dialog_plain_8, txt, 0);
*/
ver = ch32sub_get_ver();
ssd1306fb_set_cursor(10, 24);
ssd1306fb_draw_str(font_Dialog_plain_8, "sub MCU fw v", 0);
sprintf(txt, "%d", ver >> 8);
ssd1306fb_draw_str(font_Dialog_plain_8, txt, 0);
ssd1306fb_draw_str(font_Dialog_plain_8, ".", 0);
sprintf(txt, "%d", ver & 0xff);
ssd1306fb_draw_str(font_Dialog_plain_8, txt, 0);
break;
}
case LI_FONT_GLYPH_TEST: {

27
nametag8_V003/README.md Normal file
View File

@ -0,0 +1,27 @@
# GAT Nametag SC8 CH32V003 Firmware
sub mcu firmware for the GAT Nametag originally shown at Supercon 8.
responsible for doing things the main micro can't due to layout or other reasons, such as user button I/O, accelerometer interrupt, and hardware enable for the RGBLED controller.
the sub MCU is on the bottom board. to use a debugger to debug or program, connect to the SWO pin. with the nametag upright, this pin is the top left pad near the side button.
there is no workable bootloader yet present so a WCH-LinkE is required to update firmware. I hope to have time to work on i2c slave bootloader at or after Supercon 8.
## building
This is a MounRiver Studio project. Build in MRS.
## bugs, quirks, omissions
- this really isn't an appropriate MCU for this. it can't wakeup on i2c from a low power / oscillator off state, so no matter what this thing pisses away at least 1mA.
- for i2c to work at the speeds we're running, 8MHz clock is minimum. ~1-2mA.
- this MCU was chosen due to it being available and using the same toolchain as the main MCU.
- if proper sleep mode is implemented then power could be saved, with this MCU being the first to wake up then telling master to wake up. but it doesn't help active mode consumption.
- this MCU model is a "popular" thing right now, being called the 10 cent MCU even though it's never available for that price. but people love popularity and cheap shit so meh.
- i2c slave code was mostly lifted from ch32v003fun I think, but adapted for my use
- things mostly just worked OK on this board.

View File

@ -147,7 +147,7 @@ void i2cs_read_cb(uint16_t reg)
}
}
void i2cs_init(uint8_t address, uint8_t read_only_mode)
void i2cs_init(uint8_t address, uint8_t read_only_mode, uint16_t ver)
{
I2C_InitTypeDef i2c = {0};
@ -158,6 +158,9 @@ void i2cs_init(uint8_t address, uint8_t read_only_mode)
i2cs_state.read_callback = i2cs_read_cb;
i2cs_state.read_only = read_only_mode;
i2cs_reg[REG_VER_HI] = ver >> 8;
i2cs_reg[REG_VER_LO] = ver & 0xff;
i2c.I2C_ClockSpeed = 600000;
i2c.I2C_Mode = I2C_Mode_I2C;
i2c.I2C_DutyCycle = I2C_DutyCycle_2;

View File

@ -23,7 +23,8 @@ enum i2cs_werr {
enum ch32sub_regmap {
// read-only
REG_INTR_FLAGS = 0x00,
REG_RSVD_01,
REG_VER_HI,
REG_VER_LO,
REG_BTN_PUSHED_LATCHED, // buttons currently pushed.
REG_BTN_PUSHED, // buttons pushed. reading will clear this value.
REG_BTN_HELD, // buttons currently being held. reading will clear this value.
@ -33,7 +34,6 @@ enum ch32sub_regmap {
REG_BTN3_MASK,
REG_BTN4_MASK,
REG_BTN5_MASK,
REG_WERR_HI = 0x0c, // write error count, high byte
REG_WERR_LO, // write error count, low byte
REG_IRDA_READ_HI, // IrDA read packet length, hi byte (currently always 0)
@ -105,7 +105,7 @@ extern volatile uint8_t i2cs_reg[256*3];
void i2cs_init(uint8_t address, uint8_t read_only_mode);
void i2cs_init(uint8_t address, uint8_t read_only_mode, uint16_t ver);
void i2cs_append_flag(uint8_t flag);

View File

@ -26,6 +26,11 @@
#define VER_HI 0
#define VER_LO 1
static inline void gpio_init()
{
GPIO_InitTypeDef gpio = {0};
@ -132,7 +137,7 @@ int main(void)
gpio_init();
// get i2c up and running
i2cs_init(INT_I2C_ADDR, 0);
i2cs_init(INT_I2C_ADDR, 0, ((VER_HI << 8) | (VER_LO & 0xff)));
// configure various external peripherals
btn_init();