mirror of https://github.com/rusefi/canable-fw.git
Merge
This commit is contained in:
commit
52803f72f5
|
@ -20,4 +20,4 @@ before_script:
|
||||||
script: make BUILD_NUMBER=$TRAVIS_BUILD_NUMBER
|
script: make BUILD_NUMBER=$TRAVIS_BUILD_NUMBER
|
||||||
|
|
||||||
after_success:
|
after_success:
|
||||||
"artifacts upload --target-paths=builds/b$TRAVIS_BUILD_NUMBER build/CANtact*"
|
"artifacts upload --target-paths=builds/b$TRAVIS_BUILD_NUMBER build/CANtact*"
|
10
Inc/can.h
10
Inc/can.h
|
@ -2,9 +2,15 @@
|
||||||
#define _CAN_H
|
#define _CAN_H
|
||||||
|
|
||||||
enum can_bitrate {
|
enum can_bitrate {
|
||||||
CAN_BITRATE_500K,
|
CAN_BITRATE_10K,
|
||||||
CAN_BITRATE_250K,
|
CAN_BITRATE_20K,
|
||||||
|
CAN_BITRATE_50K,
|
||||||
|
CAN_BITRATE_100K,
|
||||||
CAN_BITRATE_125K,
|
CAN_BITRATE_125K,
|
||||||
|
CAN_BITRATE_250K,
|
||||||
|
CAN_BITRATE_500K,
|
||||||
|
CAN_BITRATE_750K,
|
||||||
|
CAN_BITRATE_1000K,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum can_bus_state {
|
enum can_bus_state {
|
||||||
|
|
9
Makefile
9
Makefile
|
@ -86,7 +86,11 @@ CFLAGS += -mcpu=$(CPU) -mthumb
|
||||||
CFLAGS += $(USER_CFLAGS)
|
CFLAGS += $(USER_CFLAGS)
|
||||||
|
|
||||||
# default action: build the user application
|
# default action: build the user application
|
||||||
all: $(BUILD_DIR)/$(TARGET).hex
|
all: $(BUILD_DIR)/$(TARGET).bin $(BUILD_DIR)/$(TARGET).hex
|
||||||
|
|
||||||
|
flash: all
|
||||||
|
sudo dfu-util -d 0483:df11 -c 1 -i 0 -a 0 -s 0x08000000 -D $(BUILD_DIR)/$(TARGET).bin
|
||||||
|
|
||||||
|
|
||||||
#######################################
|
#######################################
|
||||||
# build the st micro peripherial library
|
# build the st micro peripherial library
|
||||||
|
@ -149,6 +153,9 @@ $(BUILD_DIR)/$(TARGET).hex: $(BUILD_DIR)/$(TARGET).elf
|
||||||
$(OBJCOPY) -O ihex $(BUILD_DIR)/$(TARGET).elf $@
|
$(OBJCOPY) -O ihex $(BUILD_DIR)/$(TARGET).elf $@
|
||||||
$(OBJCOPY) -O binary $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).bin
|
$(OBJCOPY) -O binary $(BUILD_DIR)/$(TARGET).elf $(BUILD_DIR)/$(TARGET).bin
|
||||||
|
|
||||||
|
$(BUILD_DIR)/$(TARGET).bin: $(BUILD_DIR)/$(TARGET).elf
|
||||||
|
$(OBJCOPY) -O binary $(BUILD_DIR)/$(TARGET).elf $@
|
||||||
|
|
||||||
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) $(USB_OBJECTS) $(CUBELIB)
|
$(BUILD_DIR)/$(TARGET).elf: $(OBJECTS) $(USB_OBJECTS) $(CUBELIB)
|
||||||
$(CC) -o $@ $(CFLAGS) $(OBJECTS) $(USB_OBJECTS) \
|
$(CC) -o $@ $(CFLAGS) $(OBJECTS) $(USB_OBJECTS) \
|
||||||
$(LDFLAGS) -Xlinker \
|
$(LDFLAGS) -Xlinker \
|
||||||
|
|
|
@ -26,6 +26,8 @@ With OpenOCD running, arm-none-eabi-gdb can be used to load code and debug.
|
||||||
## Contributors
|
## Contributors
|
||||||
|
|
||||||
- [Ethan Zonca](https://github.com/normaldotcom) - Makefile fixes and code size optimization
|
- [Ethan Zonca](https://github.com/normaldotcom) - Makefile fixes and code size optimization
|
||||||
|
- [onejope](https://github.com/onejope) - Fixes to extended ID handling
|
||||||
|
- Phil Wise - Added dfu-util compatibility to Makefile
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|
94
Src/can.c
94
Src/can.c
|
@ -3,6 +3,7 @@
|
||||||
|
|
||||||
CAN_HandleTypeDef hcan;
|
CAN_HandleTypeDef hcan;
|
||||||
CAN_FilterConfTypeDef filter;
|
CAN_FilterConfTypeDef filter;
|
||||||
|
uint32_t prescaler;
|
||||||
enum can_bus_state bus_state;
|
enum can_bus_state bus_state;
|
||||||
|
|
||||||
void can_init(void) {
|
void can_init(void) {
|
||||||
|
@ -19,60 +20,89 @@ void can_init(void) {
|
||||||
filter.BankNumber = 0;
|
filter.BankNumber = 0;
|
||||||
filter.FilterActivation = ENABLE;
|
filter.FilterActivation = ENABLE;
|
||||||
|
|
||||||
|
// default to 125 kbit/s
|
||||||
|
prescaler = 48;
|
||||||
hcan.Instance = CAN;
|
hcan.Instance = CAN;
|
||||||
hcan.Init.Prescaler = 48;
|
|
||||||
hcan.Init.Mode = CAN_MODE_NORMAL;
|
|
||||||
hcan.Init.SJW = CAN_SJW_1TQ;
|
|
||||||
hcan.Init.BS1 = CAN_BS1_4TQ;
|
|
||||||
hcan.Init.BS2 = CAN_BS2_3TQ;
|
|
||||||
hcan.Init.TTCM = DISABLE;
|
|
||||||
hcan.Init.ABOM = DISABLE;
|
|
||||||
hcan.Init.AWUM = DISABLE;
|
|
||||||
hcan.Init.NART = DISABLE;
|
|
||||||
hcan.Init.RFLM = DISABLE;
|
|
||||||
hcan.Init.TXFP = DISABLE;
|
|
||||||
|
|
||||||
bus_state = OFF_BUS;
|
bus_state = OFF_BUS;
|
||||||
//status = HAL_CAN_Init(&hcan);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void can_enable(void) {
|
void can_enable(void) {
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
if (bus_state == OFF_BUS) {
|
if (bus_state == OFF_BUS) {
|
||||||
|
hcan.Init.Prescaler = prescaler;
|
||||||
hcan.Init.Mode = CAN_MODE_NORMAL;
|
hcan.Init.Mode = CAN_MODE_NORMAL;
|
||||||
hcan.pTxMsg = NULL;
|
hcan.Init.SJW = CAN_SJW_1TQ;
|
||||||
status = HAL_CAN_Init(&hcan);
|
hcan.Init.BS1 = CAN_BS1_4TQ;
|
||||||
status = HAL_CAN_ConfigFilter(&hcan, &filter);
|
hcan.Init.BS2 = CAN_BS2_3TQ;
|
||||||
bus_state = ON_BUS;
|
hcan.Init.TTCM = DISABLE;
|
||||||
|
hcan.Init.ABOM = DISABLE;
|
||||||
|
hcan.Init.AWUM = DISABLE;
|
||||||
|
hcan.Init.NART = DISABLE;
|
||||||
|
hcan.Init.RFLM = DISABLE;
|
||||||
|
hcan.Init.TXFP = DISABLE;
|
||||||
|
hcan.pTxMsg = NULL;
|
||||||
|
status = HAL_CAN_Init(&hcan);
|
||||||
|
status = HAL_CAN_ConfigFilter(&hcan, &filter);
|
||||||
|
bus_state = ON_BUS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void can_disable(void) {
|
void can_disable(void) {
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
if (bus_state == ON_BUS) {
|
if (bus_state == ON_BUS) {
|
||||||
// do a bxCAN reset (set RESET bit to 1)
|
// do a bxCAN reset (set RESET bit to 1)
|
||||||
hcan.Instance->MCR |= CAN_MCR_RESET;
|
hcan.Instance->MCR |= CAN_MCR_RESET;
|
||||||
bus_state = OFF_BUS;
|
bus_state = OFF_BUS;
|
||||||
}
|
}
|
||||||
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
|
HAL_GPIO_WritePin(GPIOB, GPIO_PIN_1, GPIO_PIN_RESET);
|
||||||
}
|
}
|
||||||
|
|
||||||
void can_set_bitrate(enum can_bitrate bitrate) {
|
void can_set_bitrate(enum can_bitrate bitrate) {
|
||||||
if (bus_state == ON_BUS) {
|
if (bus_state == ON_BUS) {
|
||||||
// cannot set bitrate while on bus
|
// cannot set bitrate while on bus
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (bitrate) {
|
switch (bitrate) {
|
||||||
case CAN_BITRATE_500K:
|
case CAN_BITRATE_10K:
|
||||||
hcan.Init.Prescaler = 12;
|
prescaler = 600;
|
||||||
break;
|
break;
|
||||||
case CAN_BITRATE_250K:
|
case CAN_BITRATE_20K:
|
||||||
hcan.Init.Prescaler = 24;
|
prescaler = 300;
|
||||||
break;
|
break;
|
||||||
case CAN_BITRATE_125K:
|
case CAN_BITRATE_50K:
|
||||||
hcan.Init.Prescaler = 48;
|
prescaler = 120;
|
||||||
break;
|
break;
|
||||||
|
case CAN_BITRATE_100K:
|
||||||
|
prescaler = 60;
|
||||||
|
break;
|
||||||
|
case CAN_BITRATE_125K:
|
||||||
|
prescaler = 48;
|
||||||
|
break;
|
||||||
|
case CAN_BITRATE_250K:
|
||||||
|
prescaler = 24;
|
||||||
|
break;
|
||||||
|
case CAN_BITRATE_500K:
|
||||||
|
prescaler = 12;
|
||||||
|
break;
|
||||||
|
case CAN_BITRATE_750K:
|
||||||
|
prescaler = 8;
|
||||||
|
break;
|
||||||
|
case CAN_BITRATE_1000K:
|
||||||
|
prescaler = 6;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void can_set_silent(uint8_t silent) {
|
||||||
|
if (bus_state == ON_BUS) {
|
||||||
|
// cannot set silent mode while on bus
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (silent) {
|
||||||
|
hcan.Init.Mode = CAN_MODE_SILENT;
|
||||||
|
} else {
|
||||||
|
hcan.Init.Mode = CAN_MODE_NORMAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,7 +130,7 @@ uint32_t can_rx(CanRxMsgTypeDef *rx_msg, uint32_t timeout) {
|
||||||
|
|
||||||
uint8_t is_can_msg_pending(uint8_t fifo) {
|
uint8_t is_can_msg_pending(uint8_t fifo) {
|
||||||
if (bus_state == OFF_BUS) {
|
if (bus_state == OFF_BUS) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return (__HAL_CAN_MSG_PENDING(&hcan, fifo) > 0);
|
return (__HAL_CAN_MSG_PENDING(&hcan, fifo) > 0);
|
||||||
}
|
}
|
||||||
|
|
83
Src/slcan.c
83
Src/slcan.c
|
@ -80,33 +80,67 @@ int8_t slcan_parse_str(char *buf, uint8_t len) {
|
||||||
// open channel command
|
// open channel command
|
||||||
can_enable();
|
can_enable();
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
} else if (buf[0] == 'C') {
|
} else if (buf[0] == 'C') {
|
||||||
// close channel command
|
// close channel command
|
||||||
can_disable();
|
can_disable();
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
} else if (buf[0] == 'S') {
|
} else if (buf[0] == 'S') {
|
||||||
// set bitrate command
|
// set bitrate command
|
||||||
switch(buf[1]) {
|
switch(buf[1]) {
|
||||||
case 0:
|
case 0:
|
||||||
can_set_bitrate(CAN_BITRATE_125K);
|
can_set_bitrate(CAN_BITRATE_10K);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
can_set_bitrate(CAN_BITRATE_250K);
|
can_set_bitrate(CAN_BITRATE_20K);
|
||||||
break;
|
break;
|
||||||
case 2:
|
case 2:
|
||||||
can_set_bitrate(CAN_BITRATE_500K);
|
can_set_bitrate(CAN_BITRATE_50K);
|
||||||
break;
|
break;
|
||||||
default:
|
case 3:
|
||||||
// invalid setting
|
can_set_bitrate(CAN_BITRATE_100K);
|
||||||
return -1;
|
break;
|
||||||
|
case 4:
|
||||||
|
can_set_bitrate(CAN_BITRATE_125K);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
can_set_bitrate(CAN_BITRATE_250K);
|
||||||
|
break;
|
||||||
|
case 6:
|
||||||
|
can_set_bitrate(CAN_BITRATE_500K);
|
||||||
|
break;
|
||||||
|
case 7:
|
||||||
|
can_set_bitrate(CAN_BITRATE_750K);
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
can_set_bitrate(CAN_BITRATE_1000K);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// invalid setting
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
} else if (buf[0] == 'm' || buf[0] == 'M') {
|
||||||
|
// set mode command
|
||||||
|
if (buf[1] == 1) {
|
||||||
|
// mode 1: silent
|
||||||
|
can_set_silent(1);
|
||||||
|
} else {
|
||||||
|
// default to normal mode
|
||||||
|
can_set_silent(0);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
|
||||||
} else if (buf[0] == 't' || buf[0] == 'T') {
|
} else if (buf[0] == 't' || buf[0] == 'T') {
|
||||||
// transmit data frame command
|
// transmit data frame command
|
||||||
frame.RTR = CAN_RTR_DATA;
|
frame.RTR = CAN_RTR_DATA;
|
||||||
|
|
||||||
} else if (buf[0] == 'r' || buf[0] == 'R') {
|
} else if (buf[0] == 'r' || buf[0] == 'R') {
|
||||||
frame.RTR = CAN_RTR_REMOTE;
|
|
||||||
// transmit remote frame command
|
// transmit remote frame command
|
||||||
|
frame.RTR = CAN_RTR_REMOTE;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// error, unknown command
|
// error, unknown command
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -121,14 +155,25 @@ int8_t slcan_parse_str(char *buf, uint8_t len) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t id_len = frame.IDE == CAN_ID_EXT ? SLCAN_EXT_ID_LEN : SLCAN_STD_ID_LEN;
|
|
||||||
frame.StdId = 0;
|
frame.StdId = 0;
|
||||||
i = 1;
|
frame.ExtId = 0;
|
||||||
while (i <= id_len) {
|
if (frame.IDE == CAN_ID_EXT) {
|
||||||
frame.StdId += buf[i++];
|
uint8_t id_len = SLCAN_EXT_ID_LEN;
|
||||||
frame.StdId *= 16;
|
i = 1;
|
||||||
|
while (i <= id_len) {
|
||||||
|
frame.ExtId *= 16;
|
||||||
|
frame.ExtId += buf[i++];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
frame.StdId /= 16;
|
else {
|
||||||
|
uint8_t id_len = SLCAN_STD_ID_LEN;
|
||||||
|
i = 1;
|
||||||
|
while (i <= id_len) {
|
||||||
|
frame.StdId *= 16;
|
||||||
|
frame.StdId += buf[i++];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
frame.DLC = buf[i++];
|
frame.DLC = buf[i++];
|
||||||
if (frame.DLC < 0 || frame.DLC > 8) {
|
if (frame.DLC < 0 || frame.DLC > 8) {
|
||||||
|
|
|
@ -81,12 +81,6 @@ void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan)
|
||||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||||
|
|
||||||
/* USER CODE BEGIN CAN_MspInit 1 */
|
/* USER CODE BEGIN CAN_MspInit 1 */
|
||||||
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
|
|
||||||
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
|
|
||||||
GPIO_InitStruct.Pull = GPIO_PULLUP;
|
|
||||||
GPIO_InitStruct.Speed = GPIO_SPEED_MEDIUM;
|
|
||||||
GPIO_InitStruct.Alternate = 0;
|
|
||||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
|
||||||
|
|
||||||
/* USER CODE END CAN_MspInit 1 */
|
/* USER CODE END CAN_MspInit 1 */
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
; Windows CANtact CDC ACM Setup File
|
||||||
|
; Copyright (c) 2000 Microsoft Corporation
|
||||||
|
|
||||||
|
[DefaultInstall]
|
||||||
|
CopyINF="cantact.inf"
|
||||||
|
|
||||||
|
[Version]
|
||||||
|
Signature="$Windows NT$"
|
||||||
|
Class=Ports
|
||||||
|
ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318}
|
||||||
|
Provider=%MFGNAME%
|
||||||
|
DriverVer=7/1/2012,10.0.0.0
|
||||||
|
|
||||||
|
[Manufacturer]
|
||||||
|
%MFGNAME%=DeviceList, NTx86, NTamd64, NTia64
|
||||||
|
|
||||||
|
[SourceDisksNames]
|
||||||
|
|
||||||
|
[SourceDisksFiles]
|
||||||
|
|
||||||
|
[DestinationDirs]
|
||||||
|
DefaultDestDir=12
|
||||||
|
|
||||||
|
[DriverInstall]
|
||||||
|
Include=mdmcpq.inf
|
||||||
|
CopyFiles=FakeModemCopyFileSection
|
||||||
|
AddReg=DriverInstall.AddReg
|
||||||
|
|
||||||
|
[DriverInstall.Services]
|
||||||
|
Include=mdmcpq.inf
|
||||||
|
AddService=usbser, 0x00000002, LowerFilter_Service_Inst
|
||||||
|
|
||||||
|
[DriverInstall.AddReg]
|
||||||
|
HKR,,EnumPropPages32,,"msports.dll,SerialPortPropPageProvider"
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
; Vendor and Product ID Definitions
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
; When developing your USB device, the VID and PID used in the PC side
|
||||||
|
; application program and the firmware on the microcontroller must match.
|
||||||
|
; Modify the below line to use your VID and PID. Use the format as shown below.
|
||||||
|
; Note: One INF file can be used for multiple devices with different VID and PIDs.
|
||||||
|
; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line.
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
[DeviceList]
|
||||||
|
%DESCRIPTION%=DriverInstall, USB\VID_AD50&PID_60C4
|
||||||
|
|
||||||
|
[DeviceList.NTx86]
|
||||||
|
%DESCRIPTION%=DriverInstall, USB\VID_AD50&PID_60C4
|
||||||
|
|
||||||
|
[DeviceList.NTamd64]
|
||||||
|
%DESCRIPTION%=DriverInstall, USB\VID_AD50&PID_60C4
|
||||||
|
|
||||||
|
[DeviceList.NTia64]
|
||||||
|
%DESCRIPTION%=DriverInstall, USB\VID_AD50&PID_60C4
|
||||||
|
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
; String Definitions
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
;Modify these strings to customize your device
|
||||||
|
;------------------------------------------------------------------------------
|
||||||
|
[Strings]
|
||||||
|
MFGNAME="http://www.cantact.io"
|
||||||
|
DESCRIPTION="CANtact USB/CAN Device"
|
Loading…
Reference in New Issue