Skip to content

Commit

Permalink
Change CAN filter method
Browse files Browse the repository at this point in the history
This commit changes the CAN filter method by using a mask instead of an
ID list.
It also adds the SLCAN filter commands support.
  • Loading branch information
Baldanos committed May 26, 2021
1 parent de5a2bf commit 32d53fc
Show file tree
Hide file tree
Showing 7 changed files with 71 additions and 51 deletions.
4 changes: 2 additions & 2 deletions src/common/mode_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,8 +116,8 @@ typedef struct {
uint8_t dev_mode;
uint32_t dev_timing;
uint32_t can_id;
uint32_t filter_id_low;
uint32_t filter_id_high;
uint32_t filter_id;
uint32_t filter_mask;
} can_config_t;

typedef struct {
Expand Down
41 changes: 32 additions & 9 deletions src/drv/stm32cube/bsp_can.c
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,25 @@ bsp_status_t bsp_can_init(bsp_dev_can_t dev_num, mode_config_proto_t* mode_conf)
return status;
}

/**
* @brief Prepare the filter values
* @param filter_value: Filter value to be applied
* @retval Value to be placed in CAN_FxR register
*/
uint32_t bsp_can_prepare_filter(uint32_t filter_value)
{
uint32_t final = 0;

// Only use 29 bits for ID / mask
filter_value &= 0x1fffffff;
//Place STDID
final |= (filter_value & 0x7ff) << 21;
//Place EXTID
final |= (filter_value & 0x1ffff800) >> 8;

return final;
}

/**
* @brief Init CAN device filter to capture all
* @param dev_num: CAN dev num.
Expand All @@ -347,7 +366,7 @@ bsp_status_t bsp_can_init_filter(bsp_dev_can_t dev_num, mode_config_proto_t* mod
hcanfilter.FilterFIFOAssignment = CAN_FILTER_FIFO0;
hcanfilter.FilterBank = 14*dev_num;
hcanfilter.FilterMode = CAN_FILTERMODE_IDMASK;
hcanfilter.FilterScale = CAN_FILTERSCALE_16BIT;
hcanfilter.FilterScale = CAN_FILTERSCALE_32BIT;
hcanfilter.FilterActivation = ENABLE;
hcanfilter.SlaveStartFilterBank = 14;

Expand All @@ -367,25 +386,29 @@ bsp_status_t bsp_can_init_filter(bsp_dev_can_t dev_num, mode_config_proto_t* mod
* @retval status: status of the init.
*/
bsp_status_t bsp_can_set_filter(bsp_dev_can_t dev_num,
mode_config_proto_t* mode_conf,
uint32_t id_low, uint32_t id_high)
mode_config_proto_t* mode_conf)
{
CAN_FilterTypeDef hcanfilter;
CAN_HandleTypeDef* hcan;
uint32_t filter_reg;

can_mode_conf[dev_num] = mode_conf;
hcan = &can_handle[dev_num];

bsp_status_t status;

hcanfilter.FilterIdLow = id_low<<5;
hcanfilter.FilterIdHigh = id_high<<5;
hcanfilter.FilterMaskIdHigh = 0;
hcanfilter.FilterMaskIdLow = 0;
filter_reg = bsp_can_prepare_filter(mode_conf->config.can.filter_id);
hcanfilter.FilterIdLow = filter_reg & 0xffff;
hcanfilter.FilterIdHigh = filter_reg >> 16;

filter_reg = bsp_can_prepare_filter(mode_conf->config.can.filter_mask);
hcanfilter.FilterMaskIdLow = filter_reg & 0xffff;
hcanfilter.FilterMaskIdHigh = filter_reg >> 16;

hcanfilter.FilterFIFOAssignment = CAN_FILTER_FIFO0;
hcanfilter.FilterBank = 14*dev_num;
hcanfilter.FilterMode = CAN_FILTERMODE_IDLIST;
hcanfilter.FilterScale = CAN_FILTERSCALE_16BIT;
hcanfilter.FilterMode = CAN_FILTERMODE_IDMASK;
hcanfilter.FilterScale = CAN_FILTERSCALE_32BIT;
hcanfilter.FilterActivation = ENABLE;
hcanfilter.SlaveStartFilterBank = 14;

Expand Down
2 changes: 1 addition & 1 deletion src/drv/stm32cube/bsp_can.h
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ bsp_status_t bsp_can_init(bsp_dev_can_t dev_num, mode_config_proto_t* mode_conf)
uint32_t bsp_can_get_speed(bsp_dev_can_t dev_num);
bsp_status_t bsp_can_set_speed(bsp_dev_can_t dev_num, uint32_t speed);
bsp_status_t bsp_can_init_filter(bsp_dev_can_t dev_num, mode_config_proto_t* mode_conf);
bsp_status_t bsp_can_set_filter(bsp_dev_can_t dev_num, mode_config_proto_t* mode_conf, uint32_t id_low, uint32_t id_high);
bsp_status_t bsp_can_set_filter(bsp_dev_can_t dev_num, mode_config_proto_t* mode_conf);
bsp_status_t bsp_can_deinit(bsp_dev_can_t dev_num);
bsp_status_t bsp_can_write(bsp_dev_can_t dev_num, can_tx_frame* tx_msg);
bsp_status_t bsp_can_read(bsp_dev_can_t dev_num, can_rx_frame* rx_msg);
Expand Down
9 changes: 5 additions & 4 deletions src/hydrabus/commands.c
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,7 @@ const t_token_dict tl_dict[] = {
{ T_TWOWIRE, "2-wire" },
{ T_CAN, "can" },
{ T_ID, "id" },
{ T_MASK, "mask" },
{ T_FILTER, "filter" },
{ T_LOW, "low" },
{ T_HIGH, "high" },
Expand Down Expand Up @@ -257,14 +258,14 @@ t_token tokens_mode_can_filter[] = {
.help = "Disable filter"
},
{
T_LOW,
T_ID,
.arg_type = T_ARG_UINT,
.help = "Lower ID to include in filter"
.help = "Filter value"
},
{
T_HIGH,
T_MASK,
.arg_type = T_ARG_UINT,
.help = "Higher ID to include in filter"
.help = "Filter mask"
},
{ }
};
Expand Down
1 change: 1 addition & 0 deletions src/hydrabus/commands.h
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,7 @@ enum {
T_TWOWIRE,
T_CAN,
T_ID,
T_MASK,
T_FILTER,
T_LOW,
T_HIGH,
Expand Down
22 changes: 10 additions & 12 deletions src/hydrabus/hydrabus_bbio_can.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ void bbio_mode_can(t_hydra_console *con)
can_tx_frame tx_msg;
can_rx_frame rx_msg;
uint32_t can_id=0;
uint32_t filter_low=0, filter_high=0;

proto->dev_num = 0;
proto->config.can.dev_speed = 500000;
Expand Down Expand Up @@ -101,7 +100,7 @@ void bbio_mode_can(t_hydra_console *con)
}
break;
case BBIO_CAN_FILTER_ON:
status = bsp_can_set_filter(proto->dev_num, proto, filter_low, filter_high);
status = bsp_can_set_filter(proto->dev_num, proto);
if(status == BSP_OK) {
cprint(con, "\x01", 1);
} else {
Expand Down Expand Up @@ -192,18 +191,17 @@ void bbio_mode_can(t_hydra_console *con)
} else if((bbio_subcommand & BBIO_CAN_FILTER) == BBIO_CAN_FILTER) {
chnRead(con->sdu, rx_buff, 4);
if(bbio_subcommand & 1) {
filter_high = rx_buff[0] << 24;
filter_high += rx_buff[1] << 16;
filter_high += rx_buff[2] << 8;
filter_high += rx_buff[3];
proto->config.can.filter_id = rx_buff[0] << 24;
proto->config.can.filter_id |= rx_buff[1] << 16;
proto->config.can.filter_id |= rx_buff[2] << 8;
proto->config.can.filter_id |= rx_buff[3];
} else {
filter_low = rx_buff[0] << 24;
filter_low += rx_buff[1] << 16;
filter_low += rx_buff[2] << 8;
filter_low += rx_buff[3];
proto->config.can.filter_mask = rx_buff[0] << 24;
proto->config.can.filter_mask |= rx_buff[1] << 16;
proto->config.can.filter_mask |= rx_buff[2] << 8;
proto->config.can.filter_mask |= rx_buff[3];
}
status = bsp_can_set_filter(proto->dev_num, proto,
filter_low, filter_high);
status = bsp_can_set_filter(proto->dev_num, proto);
if(status == BSP_OK) {
cprint(con, "\x01", 1);
} else {
Expand Down
43 changes: 20 additions & 23 deletions src/hydrabus/hydrabus_mode_can.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@ static void init_proto_default(t_hydra_console *con)
/* TS1 = 15TQ, TS2 = 5TQ, SJW = 2TQ */
proto->config.can.dev_timing = 0x14e0000;

proto->config.can.filter_id_low = 0;
proto->config.can.filter_id_high = 0;
proto->config.can.filter_id = 0;
proto->config.can.filter_mask = 0;

}

Expand Down Expand Up @@ -280,9 +280,14 @@ void slcan(t_hydra_console *con) {
/*status*/
break;
case 'M':
proto->config.can.filter_id = *(uint32_t *) &buff[1];
proto->config.can.filter_id = reverse_u32(proto->config.can.filter_id);
bsp_can_set_filter(proto->dev_num, proto);
break;
case 'm':
/*Filter*/
bsp_can_init_filter(proto->dev_num, proto);
proto->config.can.filter_mask = *(uint32_t *) &buff[1];
proto->config.can.filter_mask = reverse_u32(proto->config.can.filter_mask);
bsp_can_set_filter(proto->dev_num, proto);
break;
case 'V':
/*Version*/
Expand Down Expand Up @@ -327,10 +332,8 @@ static int init(t_hydra_console *con, t_tokenline_parsed *p)
}

/* By default, get all packets */
if (proto->config.can.filter_id_low != 0 || proto->config.can.filter_id_high != 0) {
bsp_status = bsp_can_set_filter(proto->dev_num, proto,
proto->config.can.filter_id_low,
proto->config.can.filter_id_high);
if (proto->config.can.filter_id != 0 || proto->config.can.filter_mask != 0) {
bsp_status = bsp_can_set_filter(proto->dev_num, proto);
} else {
bsp_status = bsp_can_init_filter(proto->dev_num, proto);
}
Expand Down Expand Up @@ -436,21 +439,15 @@ static int exec(t_hydra_console *con, t_tokenline_parsed *p, int token_pos)
cprintf(con, "Reset filter error %02X", bsp_status);
}
break;
case T_LOW:
case T_ID:
memcpy(&arg_int, p->buf + p->tokens[t+3], sizeof(int));
proto->config.can.filter_id_low = arg_int;
bsp_status = bsp_can_set_filter(proto->dev_num,
proto,
proto->config.can.filter_id_low,
proto->config.can.filter_id_high);
proto->config.can.filter_id = arg_int;
bsp_status = bsp_can_set_filter(proto->dev_num, proto);
break;
case T_HIGH:
case T_MASK:
memcpy(&arg_int, p->buf + p->tokens[t+3], sizeof(int));
proto->config.can.filter_id_high = arg_int;
bsp_status = bsp_can_set_filter(proto->dev_num,
proto,
proto->config.can.filter_id_low,
proto->config.can.filter_id_high);
proto->config.can.filter_mask = arg_int;
bsp_status = bsp_can_set_filter(proto->dev_num, proto);
break;
}
t+=3;
Expand Down Expand Up @@ -613,9 +610,9 @@ static int show(t_hydra_console *con, t_tokenline_parsed *p)
break;
case T_FILTER:
tokens_used++;
cprintf(con, "Low : 0x%02X\r\nHigh: 0x%02X\r\n",
proto->config.can.filter_id_low,
proto->config.can.filter_id_high);
cprintf(con, "ID : 0x%08X\r\nMask: 0x%08X\r\n",
proto->config.can.filter_id,
proto->config.can.filter_mask);
break;
default:
show_params(con);
Expand Down

0 comments on commit 32d53fc

Please # to comment.