Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added support for ErgoDox with STM32 Microcontroller #5398

Merged
merged 25 commits into from
Sep 25, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
a392fb4
Began Work On STM32 Ergodox
Codetector1374 Jan 16, 2019
079fbc4
test
Codetector1374 Jan 17, 2019
304cd5b
Now it compile. Not linking thou
Codetector1374 Jan 17, 2019
c2b9529
Screw this Linker. It links now!
Codetector1374 Jan 17, 2019
06f9f2a
Blinkly Keyboard
Codetector1374 Jan 17, 2019
4927abe
bootloader test code
Codetector1374 Jan 18, 2019
23b445a
Working on matrix / i2c stuff
Codetector1374 Jan 23, 2019
3c5251f
Progress (LED Blink)
Codetector1374 Jan 24, 2019
0365c92
Progress on MCP_23017 Status Flag
Codetector1374 Jan 24, 2019
cf99732
[WIP]
Codetector1374 Jan 24, 2019
fd84782
update
Codetector1374 Jan 25, 2019
1f1f23c
Works! Remeber to change back the bootloader address when the new boo…
Codetector1374 Jan 26, 2019
ee657d7
Time to go debug the i2c
Codetector1374 Jan 26, 2019
ec07114
Finally, it now works with PCB Rev 1.0.2
Codetector1374 Jan 29, 2019
222e791
updated for rev.2 pcb
Codetector1374 Feb 23, 2019
082de2c
minor compilation fix
Codetector1374 Mar 13, 2019
4378d6c
Merge remote-tracking branch 'upstream/master' into ergodox_stm32
Codetector1374 Mar 13, 2019
224637b
Why when debugger is enabled then everything works.
Codetector1374 Mar 13, 2019
3438cad
Remeber to call init functions.
Codetector1374 Mar 13, 2019
35591b3
Update arm i2c driver to support STM32F103 series device.
Codetector1374 Mar 14, 2019
f7b501d
fix include once header. Replaced with #pragma once.
Codetector1374 Mar 14, 2019
86db0c2
Merge remote-tracking branch 'source/master' into ergodox_stm32
Codetector1374 Jul 9, 2019
c4ec830
complication test
Codetector1374 Jul 9, 2019
20ae9ce
Merge branch 'master' into ergodox_stm32
Codetector1374 Sep 21, 2019
6ef3d88
fix conflict and support for latest gcc
Codetector1374 Sep 23, 2019
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 12 additions & 3 deletions drivers/arm/i2c_master.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,17 @@

static uint8_t i2c_address;

// ChibiOS uses two initialization structure for v1 and v2/v3 i2c APIs.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@yiancar since I think you're more familiar with this, any issues with this?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there anything else I should improve about this? Or is this good to merge?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I actually have never checked what API the f1 uses. Just to make sure @awkannan any takes on this?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd prefer more general means of determining the i2c code to use rather than a specific MCU symbol definition, although ChibiOS doesn't exactly make it easy. Even if it was just the generic family definition instead (STM32F1xx) I'd be happy enough.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven't tested this i2c code on STM32F1xx.

I agree with @pelrun. There are also multiple i2c buses available to use on STM chips, so this still is not enough.

Until we figure out a good way to handle i2c bus selection and using family definition, I'd personally prefer to keep this in keyboard branches, etc. Just override i2c_master in your local keyboard folder. But I'm not the judge of that, I defer to QMK people to figure it out. The reason I say this though is because my RGB code is stuck in purgatory because it doesn't support every STM32 chip yet.

Also, as it stands, any non STM32F1xx chip would fall back to the F303 code, which is wrong on many chips. I like how we do it in eeprom, where we raise an error if no one has written the code for a specific family.

I also don't know how I feel about making tons of ifdefs, but I don't know a better alternative.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The best solution would probably be to add an explicit symbol in the board definition and choose based on that. I was planning on bringing in to core the main board definitions that are floating around some of the keyboards, at which point it's fairly straightforward to keep them in line.

Copy link
Contributor Author

@Codetector1374 Codetector1374 Mar 21, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree with @pelrun, however I didn't make it so that you have to declare this in board.h because I feel like that would break compatibility with a lot of existing code. I am thinking about either let the board.h define the config structure and initialization, thus they can both control the i2c version and which i2c bus to use. However, again, this would come at the cost of backwards compatibility. I initially just provided my own i2c_master file, but @drashna suggested to me that I should probably use the standard i2c_master. So I modified the i2c master. And honestly, I see the i2cmaster file the best to be more of a utility than configure the i2c bus.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If this is an issue right now, then it should be fine to revert back to the separate files.

Though, I'm not fond of having multiple files, but it seems like this is the best option until we have a better way to handle this.

// The F1 series uses the v1 api, which have to initialized this way.
#ifdef STM32F103xB
static const I2CConfig i2cconfig = {
OPMODE_I2C,
400000,
FAST_DUTY_CYCLE_2,
};
#else
// This configures the I2C clock to 400khz assuming a 72Mhz clock
// For more info : https://www.st.com/en/embedded-software/stsw-stm32126.html
static const I2CConfig i2cconfig = {
#ifdef USE_I2CV1
I2C1_OPMODE,
Expand All @@ -41,6 +52,7 @@ static const I2CConfig i2cconfig = {
STM32_TIMINGR_PRESC(I2C1_TIMINGR_PRESC) | STM32_TIMINGR_SCLDEL(I2C1_TIMINGR_SCLDEL) | STM32_TIMINGR_SDADEL(I2C1_TIMINGR_SDADEL) | STM32_TIMINGR_SCLH(I2C1_TIMINGR_SCLH) | STM32_TIMINGR_SCLL(I2C1_TIMINGR_SCLL), 0, 0
#endif
};
#endif

static i2c_status_t chibios_to_qmk(const msg_t* status) {
switch (*status) {
Expand All @@ -60,16 +72,13 @@ __attribute__((weak)) void i2c_init(void) {
palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_INPUT);

chThdSleepMilliseconds(10);

#ifdef USE_I2CV1
palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, PAL_MODE_STM32_ALTERNATE_OPENDRAIN);
palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_STM32_ALTERNATE_OPENDRAIN);
#else
palSetPadMode(I2C1_SCL_BANK, I2C1_SCL, PAL_MODE_ALTERNATE(I2C1_SCL_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
palSetPadMode(I2C1_SDA_BANK, I2C1_SDA, PAL_MODE_ALTERNATE(I2C1_SDA_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
#endif

// i2cInit(); //This is invoked by halInit() so no need to redo it.
}

i2c_status_t i2c_start(uint8_t address) {
Expand Down
51 changes: 51 additions & 0 deletions keyboards/ergodox_stm32/boards/ERGODOX_STM32_BOARD/board.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
/*
ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

#include "hal.h"

/**
* @brief PAL setup.
* @details Digital I/O ports static configuration as defined in @p board.h.
* This variable is used by the HAL when initializing the PAL driver.
*/
#if HAL_USE_PAL || defined(__DOXYGEN__)
const PALConfig pal_default_config =
{
{VAL_GPIOAODR, VAL_GPIOACRL, VAL_GPIOACRH},
{VAL_GPIOBODR, VAL_GPIOBCRL, VAL_GPIOBCRH},
{VAL_GPIOCODR, VAL_GPIOCCRL, VAL_GPIOCCRH},
{VAL_GPIODODR, VAL_GPIODCRL, VAL_GPIODCRH},
{VAL_GPIOEODR, VAL_GPIOECRL, VAL_GPIOECRH},
};
#endif

/*
* Early initialization code.
* This initialization must be performed just after stack setup and before
* any other initialization.
*/
void __early_init(void) {

stm32_clock_init();
}

/*
* Board-specific initialization code.
*/
void boardInit(void) {
AFIO->MAPR |= AFIO_MAPR_SWJ_CFG_JTAGDISABLE;

}
142 changes: 142 additions & 0 deletions keyboards/ergodox_stm32/boards/ERGODOX_STM32_BOARD/board.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
/*
ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

#ifndef _BOARD_H_
#define _BOARD_H_

/*
* Board identifier.
*/
#define BOARD_JM60
#define BOARD_NAME "ErgoDox STM32 Keyboard"

/*
* Board frequencies.
*/
#define STM32_LSECLK 0
#define STM32_HSECLK 8000000

/*
* MCU type, supported types are defined in ./os/hal/platforms/hal_lld.h.
*
* Only xB (128KB Flash) is defined, but it's identical to the
* x8 version (64KB Flash) except for the Flash region size in the
* linker script. For x8 parts use xB here and change to the x8 linker
* script in the project Makefile.
*/
#define STM32F103xB

/*
* IO pins assignments
*
* numbering is sorted by onboard/connectors, as from the schematics in
* http://www.vcc-gnd.com/read.php?tid=369
*/

/* on-board */
#define GPIOA_USBDM 11 // pin 8
#define GPIOA_USBDP 12 // pin 9

#define GPIOC_OSC32_IN 14
#define GPIOC_OSC32_OUT 15

/*
* I/O ports initial setup, this configuration is established soon after reset
* in the initialization code.
*
* The digits have the following meaning:
* 0 - Analog input.
* 1 - Push Pull output 10MHz.
* 2 - Push Pull output 2MHz.
* 3 - Push Pull output 50MHz.
* 4 - Digital input.
* 5 - Open Drain output 10MHz.
* 6 - Open Drain output 2MHz.
* 7 - Open Drain output 50MHz.
* 8 - Digital input with PullUp or PullDown resistor depending on ODR.
* 9 - Alternate Push Pull output 10MHz.
* A - Alternate Push Pull output 2MHz.
* B - Alternate Push Pull output 50MHz.
* C - Reserved.
* D - Alternate Open Drain output 10MHz.
* E - Alternate Open Drain output 2MHz.
* F - Alternate Open Drain output 50MHz.
* Please refer to the STM32 Reference Manual for details.
*/

/*
* Port A setup.
* Everything input with pull-up except:
*/
#define VAL_GPIOACRL 0x88888888 /* PA7...PA0 */
#define VAL_GPIOACRH 0x88888888 /* PA15...PA8 */
#define VAL_GPIOAODR 0xFFFFFFFF

/*
* Port B setup.
* Everything input with pull-up except:
*/
#define VAL_GPIOBCRL 0x88888888 /* PB7...PB0 */
#define VAL_GPIOBCRH 0x88888888 /* PB15...PB8 */
#define VAL_GPIOBODR 0xFFFFFFFF

/*
* Port C setup.
* Everything input with pull-up except:
*/
#define VAL_GPIOCCRL 0x88888888 /* PC7...PC0 */
#define VAL_GPIOCCRH 0x88888888 /* PC15...PC8 */
#define VAL_GPIOCODR 0xFFFFFFFF

/*
* Port D setup.
* Everything input with pull-up except:
* PD0 - Normal input (XTAL).
* PD1 - Normal input (XTAL).
*/
#define VAL_GPIODCRL 0x88888844 /* PD7...PD0 */
#define VAL_GPIODCRH 0x88888888 /* PD15...PD8 */
#define VAL_GPIODODR 0xFFFFFFFF

/*
* Port E setup.
* Everything input with pull-up except:
*/
#define VAL_GPIOECRL 0x88888888 /* PE7...PE0 */
#define VAL_GPIOECRH 0x88888888 /* PE15...PE8 */
#define VAL_GPIOEODR 0xFFFFFFFF

/*
* USB bus activation macro, required by the USB driver.
*/
#define usb_lld_connect_bus(usbp) /* always connected */

/*
* USB bus de-activation macro, required by the USB driver.
*/
#define usb_lld_disconnect_bus(usbp) /* always connected */

#if !defined(_FROM_ASM_)
#ifdef __cplusplus
extern "C" {
#endif
void boardInit(void);
#ifdef __cplusplus
}
#endif
#endif /* _FROM_ASM_ */

#endif /* _BOARD_H_ */
5 changes: 5 additions & 0 deletions keyboards/ergodox_stm32/boards/ERGODOX_STM32_BOARD/board.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# List of all the board related files.
BOARDSRC = $(BOARD_PATH)/boards/ERGODOX_STM32_BOARD/board.c

# Required include directories
BOARDINC = $(BOARD_PATH)/boards/ERGODOX_STM32_BOARD
Loading