Add variable numbers of SPI/UART/I2C/EXTI devices - #1346

This commit is contained in:
Gordon Williams 2018-02-19 12:51:34 +00:00
parent 6634aad17c
commit ec20db1438
6 changed files with 135 additions and 138 deletions

View File

@ -70,20 +70,21 @@ print("Variables = "+str(variables))
print("JsVar size = "+str(var_size))
print("VarCache size = "+str(var_cache_size))
flash_page_size = 1024
if LINUX:
flash_page_size = 1024
flash_saved_code_pages = 8
total_flash = flash_page_size*flash_saved_code_pages
else: # NOT LINUX
# 100xB and 103xB are mid-density, so have 1k page sizes
if board.chip["part"][:7]=="STM32F1" and board.chip["part"][10]=="B": board.chip["subfamily"]="MD";
flash_page_size = 1024 # just a guess
if board.chip["family"]=="STM32F1": flash_page_size = 1024 if "subfamily" in board.chip and board.chip["subfamily"]=="MD" else 2048
if board.chip["family"]=="STM32F1":
flash_page_size = 1024 if "subfamily" in board.chip and board.chip["subfamily"]=="MD" else 2048
if board.chip["family"]=="STM32F2":
flash_page_size = 128*1024
if board.chip["family"]=="STM32F3": flash_page_size = 2*1024
if board.chip["family"]=="STM32F3":
flash_page_size = 2*1024
if board.chip["family"]=="STM32F4":
flash_page_size = 128*1024
if board.chip["family"]=="NRF51":
@ -161,8 +162,11 @@ codeOut("#define PC_BOARD_CHIP_FAMILY \""+board.chip["family"]+"\"")
codeOut("")
linker_end_var = "_end";
linker_etext_var = "_etext";
# Linker vars used for:
linker_end_var = "_end"; # End of RAM (eg top of stack)
linker_etext_var = "_etext"; # End of text (function) section
# External interrupt count
exti_count = 16
if board.chip["family"]=="LINUX":
board.chip["class"]="LINUX"
@ -192,12 +196,14 @@ elif board.chip["family"]=="NRF51":
board.chip["class"]="NRF51"
linker_etext_var = "__etext";
linker_end_var = "end";
exti_count = 4
codeOut('#include "nrf.h"')
elif board.chip["family"]=="NRF52":
board.chip["class"]="NRF52"
linker_etext_var = "__etext";
linker_end_var = "end";
codeOut('#include "nrf.h"') # TRY THIS BUT NOT SURE~!
exti_count = 8
codeOut('#include "nrf.h"')
elif board.chip["family"]=="EFM32GG":
board.chip["class"]="EFM32"
linker_etext_var = "__etext";
@ -210,6 +216,7 @@ elif board.chip["family"]=="ESP8266":
board.chip["class"]="ESP8266"
elif board.chip["family"]=="ESP32":
board.chip["class"]="ESP32"
exti_count = 40
elif board.chip["family"]=="SAMD":
board.chip["class"]="SAMD"
codeOut('#include "targetlibs/samd/include/due_sam3x.init.h"')
@ -285,12 +292,14 @@ else:
codeOut("#define FLASH_SAVED_CODE_START "+str(flash_saved_code_start))
codeOut("#define FLASH_SAVED_CODE_LENGTH "+str(int(flash_page_size*flash_saved_code_pages)))
codeOut("");
codeOut("#define CLOCK_SPEED_MHZ "+str(board.chip["speed"]))
codeOut("#define USART_COUNT "+str(board.chip["usart"]))
codeOut("#define SPI_COUNT "+str(board.chip["spi"]))
codeOut("#define I2C_COUNT "+str(board.chip["i2c"]))
codeOut("#define ADC_COUNT "+str(board.chip["adc"]))
codeOut("#define DAC_COUNT "+str(board.chip["dac"]))
codeOut("#define EXTI_COUNT "+str(exti_count))
codeOut("");
codeOut("#define DEFAULT_CONSOLE_DEVICE "+board.info["default_console"]);
if "default_console_tx" in board.info:

View File

@ -541,8 +541,12 @@ const char *jshGetDeviceString(
case EV_TERMINAL: return "Terminal";
#endif
case EV_SERIAL1: return "Serial1";
#if USART_COUNT>=2
case EV_SERIAL2: return "Serial2";
#endif
#if USART_COUNT>=3
case EV_SERIAL3: return "Serial3";
#endif
#if USART_COUNT>=4
case EV_SERIAL4: return "Serial4";
#endif
@ -604,43 +608,25 @@ IOEventFlags jshFromDeviceString(
#endif
}
else if (device[0]=='S') {
if (device[1]=='e' && device[2]=='r' && device[3]=='i' && device[4]=='a' && device[5]=='l' && device[6]!=0 && device[7]==0) {
if (device[6]=='1') return EV_SERIAL1;
if (device[6]=='2') return EV_SERIAL2;
if (device[6]=='3') return EV_SERIAL3;
#if USART_COUNT>=4
if (device[6]=='4') return EV_SERIAL4;
#if USART_COUNT>0
if (device[1]=='e' && device[2]=='r' && device[3]=='i' && device[4]=='a' && device[5]=='l' &&
device[6]>='1' && (device[6]-'1')<USART_COUNT &&
device[7]==0)
return EV_SERIAL1+device[6]-'1';
#endif
#if USART_COUNT>=5
if (device[6]=='5') return EV_SERIAL5;
#endif
#if USART_COUNT>=6
if (device[6]=='6') return EV_SERIAL6;
#endif
}
if (device[1]=='P' && device[2]=='I' && device[3]!=0 && device[4]==0) {
#if SPI_COUNT>=1
if (device[3]=='1') return EV_SPI1;
#endif
#if SPI_COUNT>=2
if (device[3]=='2') return EV_SPI2;
#endif
#if SPI_COUNT>=3
if (device[3]=='3') return EV_SPI3;
#endif
}
}
else if (device[0]=='I' && device[1]=='2' && device[2]=='C' && device[3]!=0 && device[4]==0) {
#if I2C_COUNT>=1
if (device[3]=='1') return EV_I2C1;
#endif
#if I2C_COUNT>=2
if (device[3]=='2') return EV_I2C2;
#endif
#if I2C_COUNT>=3
if (device[3]=='3') return EV_I2C3;
#if SPI_COUNT>0
if (device[1]=='P' && device[2]=='I' &&
device[3]>='1' && (device[3]-'1')<SPI_COUNT &&
device[4]==0)
return EV_SPI1+device[3]-'1';
#endif
}
#if I2C_COUNT>0
else if (device[0]=='I' && device[1]=='2' && device[2]=='C' &&
device[3]>='1' && (device[3]-'1')<I2C_COUNT &&
device[4]==0)
return EV_I2C1+device[3]-'1';
#endif
return EV_NONE;
}

View File

@ -35,30 +35,15 @@ void jshResetDevices();
typedef enum {
// device type
EV_NONE,
EV_EXTI0, // External Interrupt 0
EV_EXTI1, // External Interrupt 1
EV_EXTI2, // External Interrupt 2
EV_EXTI3, // External Interrupt 3
EV_EXTI4, // External Interrupt 4
EV_EXTI5, // External Interrupt 5
EV_EXTI6, // External Interrupt 6
EV_EXTI7, // External Interrupt 7
EV_EXTI8, // External Interrupt 8
EV_EXTI9, // External Interrupt 9
EV_EXTI10, // External Interrupt 10
EV_EXTI11, // External Interrupt 11
EV_EXTI12, // External Interrupt 12
EV_EXTI13, // External Interrupt 13
EV_EXTI14, // External Interrupt 14
EV_EXTI15, // External Interrupt 15
EV_EXTI_MAX = EV_EXTI15,
EV_EXTI0, ///< External Interrupt
EV_EXTI_MAX = EV_EXTI0 + EXTI_COUNT - 1,
EV_SERIAL_START,
EV_LOOPBACKA = EV_SERIAL_START,
EV_LOOPBACKB,
EV_LIMBO, // Where console output goes right after boot - one sec later we move it to USB/Serial
EV_USBSERIAL,
EV_LIMBO, ///< Where console output goes right after boot - one sec later we move it to USB/Serial
EV_USBSERIAL, ///< USB CDC Serial Data
#ifdef BLUETOOTH
EV_BLUETOOTH,
EV_BLUETOOTH, ///< Bluetooth LE
#endif
#ifdef USE_TELNET
EV_TELNET,
@ -66,32 +51,56 @@ typedef enum {
#ifdef USE_TERMINAL
EV_TERMINAL, // Built-in VT100 terminal
#endif
#if USART_COUNT>=1
EV_SERIAL1, // Used for IO for UARTS
#endif
#if USART_COUNT>=2
EV_SERIAL2,
#endif
#if USART_COUNT>=3
EV_SERIAL3,
#endif
#if USART_COUNT>=4
EV_SERIAL4,
#endif
#if USART_COUNT>=5
EV_SERIAL5,
#endif
#if USART_COUNT>=6
EV_SERIAL6,
EV_SERIAL_MAX = EV_SERIAL6,
#endif
#if USART_COUNT>=1
EV_SERIAL_MAX = EV_SERIAL1 + USART_COUNT - 1,
EV_SERIAL1_STATUS, // Used to store serial status info
EV_SERIAL2_STATUS,
EV_SERIAL3_STATUS,
EV_SERIAL4_STATUS,
EV_SERIAL5_STATUS,
EV_SERIAL6_STATUS,
EV_SERIAL_STATUS_MAX = EV_SERIAL6_STATUS,
EV_SERIAL_STATUS_MAX = EV_SERIAL1_STATUS + USART_COUNT - 1,
#endif
#ifdef BLUETOOTH
EV_BLUETOOTH_PENDING, // Pending tasks set by
#endif
EV_SPI1,
#if SPI_COUNT>=1
EV_SPI1, ///< SPI Devices
#endif
#if SPI_COUNT>=2
EV_SPI2,
#endif
#if SPI_COUNT>=3
EV_SPI3,
EV_SPI_MAX = EV_SPI3,
EV_I2C1,
#endif
#if SPI_COUNT>=1
EV_SPI_MAX = EV_SPI1 + SPI_COUNT - 1,
#endif
#if I2C_COUNT>=1
EV_I2C1, ///< I2C Devices
#endif
#if I2C_COUNT>=2
EV_I2C2,
#endif
#if I2C_COUNT>=3
EV_I2C3,
EV_I2C_MAX = EV_I2C3,
#endif
#if I2C_COUNT>=1
EV_I2C_MAX = EV_I2C1 + I2C_COUNT - 1,
#endif
EV_DEVICE_MAX = EV_SERIAL_STATUS_MAX,
// EV_DEVICE_MAX should not be >64 - see DEVICE_INITIALISED_FLAGS
EV_TYPE_MASK = NEXT_POWER_2(EV_DEVICE_MAX) - 1,
@ -107,15 +116,28 @@ typedef enum {
EV_EXTI_IS_HIGH = EV_TYPE_MASK+1,
} PACKED_FLAGS IOEventFlags;
#define DEVICE_SANITY_CHECK() if (EV_TYPE_MASK!=63) jsError("DEVICE_SANITY_CHECK failed")
#define DEVICE_SANITY_CHECK() if (EV_TYPE_MASK>63) jsError("DEVICE_SANITY_CHECK failed")
// Return true if the device is a USART
#if USART_COUNT>=1
#define DEVICE_IS_USART(X) (((X)>=EV_SERIAL_START) && ((X)<=EV_SERIAL_MAX))
#define DEVICE_IS_USART_STATUS(X) (((X)>=EV_SERIAL1_STATUS) && ((X)<=EV_SERIAL_STATUS_MAX))
#else
#define DEVICE_IS_USART(X) (false)
#define DEVICE_IS_USART_STATUS(X) (false)
#endif
// Return true if the device is an SPI.
#if SPI_COUNT>=1
#define DEVICE_IS_SPI(X) (((X)>=EV_SPI1) && ((X)<=EV_SPI_MAX))
#else
#define DEVICE_IS_SPI(X) (false)
#endif
#if I2C_COUNT>=1
#define DEVICE_IS_I2C(X) (((X)>=EV_I2C1) && ((X)<=EV_I2C_MAX))
#else
#define DEVICE_IS_I2C(X) (false)
#endif
#define DEVICE_IS_EXTI(X) (((X)>=EV_EXTI0) && ((X)<=EV_EXTI_MAX))
#define IOEVENTFLAGS_SERIAL_TO_SERIAL_STATUS(X) ((X) + EV_SERIAL1_STATUS - EV_SERIAL1)

View File

@ -259,44 +259,24 @@ void jshPinOutput(
// Convert an event type flag into a jshPinFunction for an actual hardware device
JshPinFunction jshGetPinFunctionFromDevice(IOEventFlags device) {
switch (device) {
case EV_SERIAL1 : return JSH_USART1;
case EV_SERIAL2 : return JSH_USART2;
case EV_SERIAL3 : return JSH_USART3;
case EV_SERIAL4 : return JSH_USART4;
case EV_SERIAL5 : return JSH_USART5;
case EV_SERIAL6 : return JSH_USART6;
case EV_SPI1 : return JSH_SPI1;
case EV_SPI2 : return JSH_SPI2;
case EV_SPI3 : return JSH_SPI3;
case EV_I2C1 : return JSH_I2C1;
case EV_I2C2 : return JSH_I2C2;
case EV_I2C3 : return JSH_I2C3;
default: return 0;
}
if (DEVICE_IS_USART(device))
return JSH_USART1 + device - EV_SERIAL1;
if (DEVICE_IS_SPI(device))
return JSH_SPI1 + device - EV_SPI1;
if (DEVICE_IS_I2C(device))
return JSH_I2C1 + device - EV_I2C1;
return 0;
}
// Convert a jshPinFunction to an event type flag
IOEventFlags jshGetFromDevicePinFunction(JshPinFunction func) {
switch (func & JSH_MASK_TYPE) {
case JSH_USART1 : return EV_SERIAL1;
case JSH_USART2 : return EV_SERIAL2;
case JSH_USART3 : return EV_SERIAL3;
case JSH_USART4 : return EV_SERIAL4;
case JSH_USART5 : return EV_SERIAL5;
case JSH_USART6 : return EV_SERIAL6;
case JSH_SPI1 : return EV_SPI1;
case JSH_SPI2 : return EV_SPI2;
case JSH_SPI3 : return EV_SPI3;
case JSH_I2C1 : return EV_I2C1;
case JSH_I2C2 : return EV_I2C2;
case JSH_I2C3 : return EV_I2C3;
default: return 0;
}
if (JSH_PINFUNCTION_IS_USART(func))
return EV_SERIAL1 + func - JSH_USART1;
if (JSH_PINFUNCTION_IS_SPI(func))
return EV_SPI1 + func - JSH_SPI1;
if (JSH_PINFUNCTION_IS_I2C(func))
return EV_I2C1 + func - JSH_I2C1;
return 0;
}
/** Try and find a specific type of function for the given pin. Can be given an invalid pin and will return 0. */

View File

@ -184,73 +184,73 @@ void EXTI0_IRQHandler(void) {
}
void EXTI1_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line1) == SET) {
jshPushIOWatchEvent(EV_EXTI1);
jshPushIOWatchEvent(EV_EXTI0+1);
EXTI_ClearITPendingBit(EXTI_Line1);
}
}
void EXTI2_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line2) == SET) {
jshPushIOWatchEvent(EV_EXTI2);
jshPushIOWatchEvent(EV_EXTI0+2);
EXTI_ClearITPendingBit(EXTI_Line2);
}
}
void EXTI3_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line3) == SET) {
jshPushIOWatchEvent(EV_EXTI3);
jshPushIOWatchEvent(EV_EXTI0+3);
EXTI_ClearITPendingBit(EXTI_Line3);
}
}
void EXTI4_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line4) == SET) {
jshPushIOWatchEvent(EV_EXTI4);
jshPushIOWatchEvent(EV_EXTI0+4);
EXTI_ClearITPendingBit(EXTI_Line4);
}
}
void EXTI9_5_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line5) == SET) {
jshPushIOWatchEvent(EV_EXTI5);
jshPushIOWatchEvent(EV_EXTI0+5);
EXTI_ClearITPendingBit(EXTI_Line5);
}
if (EXTI_GetITStatus(EXTI_Line6) == SET) {
jshPushIOWatchEvent(EV_EXTI6);
jshPushIOWatchEvent(EV_EXTI0+6);
EXTI_ClearITPendingBit(EXTI_Line6);
}
if (EXTI_GetITStatus(EXTI_Line7) == SET) {
jshPushIOWatchEvent(EV_EXTI7);
jshPushIOWatchEvent(EV_EXTI0+7);
EXTI_ClearITPendingBit(EXTI_Line7);
}
if (EXTI_GetITStatus(EXTI_Line8) == SET) {
jshPushIOWatchEvent(EV_EXTI8);
jshPushIOWatchEvent(EV_EXTI0+8);
EXTI_ClearITPendingBit(EXTI_Line8);
}
if (EXTI_GetITStatus(EXTI_Line9) == SET) {
jshPushIOWatchEvent(EV_EXTI9);
jshPushIOWatchEvent(EV_EXTI0+9);
EXTI_ClearITPendingBit(EXTI_Line9);
}
}
void EXTI15_10_IRQHandler(void) {
if (EXTI_GetITStatus(EXTI_Line10) == SET) {
jshPushIOWatchEvent(EV_EXTI10);
jshPushIOWatchEvent(EV_EXTI0+10);
EXTI_ClearITPendingBit(EXTI_Line10);
}
if (EXTI_GetITStatus(EXTI_Line11) == SET) {
jshPushIOWatchEvent(EV_EXTI11);
jshPushIOWatchEvent(EV_EXTI0+11);
EXTI_ClearITPendingBit(EXTI_Line11);
}
if (EXTI_GetITStatus(EXTI_Line12) == SET) {
jshPushIOWatchEvent(EV_EXTI12);
jshPushIOWatchEvent(EV_EXTI0+12);
EXTI_ClearITPendingBit(EXTI_Line12);
}
if (EXTI_GetITStatus(EXTI_Line13) == SET) {
jshPushIOWatchEvent(EV_EXTI13);
jshPushIOWatchEvent(EV_EXTI0+13);
EXTI_ClearITPendingBit(EXTI_Line13);
}
if (EXTI_GetITStatus(EXTI_Line14) == SET) {
jshPushIOWatchEvent(EV_EXTI14);
jshPushIOWatchEvent(EV_EXTI0+14);
EXTI_ClearITPendingBit(EXTI_Line14);
}
if (EXTI_GetITStatus(EXTI_Line15) == SET) {
jshPushIOWatchEvent(EV_EXTI15);
jshPushIOWatchEvent(EV_EXTI0+15);
EXTI_ClearITPendingBit(EXTI_Line15);
}
}

View File

@ -179,73 +179,73 @@ void EXTI0_IRQHandler(void) {
}
void EXTI1_IRQHandler(void) {
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_1) == SET) {
jshPushIOWatchEvent(EV_EXTI1);
jshPushIOWatchEvent(EV_EXTI0+1);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_1);
}
}
void EXTI2_IRQHandler(void) {
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_2) == SET) {
jshPushIOWatchEvent(EV_EXTI2);
jshPushIOWatchEvent(EV_EXTI0+2);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_2);
}
}
void EXTI3_IRQHandler(void) {
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_3) == SET) {
jshPushIOWatchEvent(EV_EXTI3);
jshPushIOWatchEvent(EV_EXTI0+3);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_3);
}
}
void EXTI4_IRQHandler(void) {
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_4) == SET) {
jshPushIOWatchEvent(EV_EXTI4);
jshPushIOWatchEvent(EV_EXTI0+4);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_4);
}
}
void EXTI9_5_IRQHandler(void) {
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_5) == SET) {
jshPushIOWatchEvent(EV_EXTI5);
jshPushIOWatchEvent(EV_EXTI0+5);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_5);
}
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_6) == SET) {
jshPushIOWatchEvent(EV_EXTI6);
jshPushIOWatchEvent(EV_EXTI0+6);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_6);
}
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_7) == SET) {
jshPushIOWatchEvent(EV_EXTI7);
jshPushIOWatchEvent(EV_EXTI0+7);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_7);
}
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_8) == SET) {
jshPushIOWatchEvent(EV_EXTI8);
jshPushIOWatchEvent(EV_EXTI0+8);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_8);
}
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_9) == SET) {
jshPushIOWatchEvent(EV_EXTI9);
jshPushIOWatchEvent(EV_EXTI0+9);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_9);
}
}
void EXTI15_10_IRQHandler(void) {
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_10) == SET) {
jshPushIOWatchEvent(EV_EXTI10);
jshPushIOWatchEvent(EV_EXTI0+10);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_10);
}
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_11) == SET) {
jshPushIOWatchEvent(EV_EXTI11);
jshPushIOWatchEvent(EV_EXTI0+11);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_11);
}
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_12) == SET) {
jshPushIOWatchEvent(EV_EXTI12);
jshPushIOWatchEvent(EV_EXTI0+12);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_12);
}
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_13) == SET) {
jshPushIOWatchEvent(EV_EXTI13);
jshPushIOWatchEvent(EV_EXTI0+13);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_13);
}
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_14) == SET) {
jshPushIOWatchEvent(EV_EXTI14);
jshPushIOWatchEvent(EV_EXTI0+14);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_14);
}
if (LL_EXTI_IsActiveFlag_0_31(LL_EXTI_LINE_15) == SET) {
jshPushIOWatchEvent(EV_EXTI15);
jshPushIOWatchEvent(EV_EXTI0+15);
LL_EXTI_ClearFlag_0_31(LL_EXTI_LINE_15);
}
}