drivers: CAN: MCP2515: Add and use Load TX Buffer instruction
Reduces SPI data for loading TX buffer by 1 byte Signed-off-by: Nick Ward <nix.ward@gmail.com>
This commit is contained in:
parent
a64f998645
commit
4816d06cfb
2 changed files with 41 additions and 4 deletions
|
@ -60,6 +60,38 @@ static int mcp2515_cmd_write_reg(struct device *dev, u8_t reg_addr,
|
||||||
return spi_write(DEV_DATA(dev)->spi, &DEV_DATA(dev)->spi_cfg, &tx);
|
return spi_write(DEV_DATA(dev)->spi, &DEV_DATA(dev)->spi_cfg, &tx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Load TX buffer instruction
|
||||||
|
*
|
||||||
|
* When loading a transmit buffer, reduces the overhead of a normal WRITE
|
||||||
|
* command by placing the Address Pointer at one of six locations, as
|
||||||
|
* selected by parameter abc.
|
||||||
|
*
|
||||||
|
* 0: TX Buffer 0, Start at TXB0SIDH (0x31)
|
||||||
|
* 1: TX Buffer 0, Start at TXB0D0 (0x36)
|
||||||
|
* 2: TX Buffer 1, Start at TXB1SIDH (0x41)
|
||||||
|
* 3: TX Buffer 1, Start at TXB1D0 (0x46)
|
||||||
|
* 4: TX Buffer 2, Start at TXB2SIDH (0x51)
|
||||||
|
* 5: TX Buffer 2, Start at TXB2D0 (0x56)
|
||||||
|
*/
|
||||||
|
static int mcp2515_cmd_load_tx_buffer(struct device *dev, u8_t abc,
|
||||||
|
u8_t *buf_data, u8_t buf_len)
|
||||||
|
{
|
||||||
|
__ASSERT(abc <= 5, "abc <= 5");
|
||||||
|
|
||||||
|
u8_t cmd_buf[] = { MCP2515_OPCODE_LOAD_TX_BUFFER | abc };
|
||||||
|
|
||||||
|
struct spi_buf tx_buf[] = {
|
||||||
|
{ .buf = cmd_buf, .len = sizeof(cmd_buf) },
|
||||||
|
{ .buf = buf_data, .len = buf_len }
|
||||||
|
};
|
||||||
|
const struct spi_buf_set tx = {
|
||||||
|
.buffers = tx_buf, .count = ARRAY_SIZE(tx_buf)
|
||||||
|
};
|
||||||
|
|
||||||
|
return spi_write(DEV_DATA(dev)->spi, &DEV_DATA(dev)->spi_cfg, &tx);
|
||||||
|
}
|
||||||
|
|
||||||
static int mcp2515_cmd_read_reg(struct device *dev, u8_t reg_addr,
|
static int mcp2515_cmd_read_reg(struct device *dev, u8_t reg_addr,
|
||||||
u8_t *buf_data, u8_t buf_len)
|
u8_t *buf_data, u8_t buf_len)
|
||||||
{
|
{
|
||||||
|
@ -292,6 +324,7 @@ static int mcp2515_send(struct device *dev, const struct zcan_frame *msg,
|
||||||
{
|
{
|
||||||
struct mcp2515_data *dev_data = DEV_DATA(dev);
|
struct mcp2515_data *dev_data = DEV_DATA(dev);
|
||||||
u8_t tx_idx = 0U;
|
u8_t tx_idx = 0U;
|
||||||
|
u8_t abc;
|
||||||
u8_t addr_tx_ctrl;
|
u8_t addr_tx_ctrl;
|
||||||
u8_t tx_frame[MCP2515_FRAME_LEN];
|
u8_t tx_frame[MCP2515_FRAME_LEN];
|
||||||
|
|
||||||
|
@ -323,9 +356,12 @@ static int mcp2515_send(struct device *dev, const struct zcan_frame *msg,
|
||||||
(tx_idx * MCP2515_ADDR_OFFSET_FRAME2FRAME);
|
(tx_idx * MCP2515_ADDR_OFFSET_FRAME2FRAME);
|
||||||
|
|
||||||
mcp2515_convert_zcanframe_to_mcp2515frame(msg, tx_frame);
|
mcp2515_convert_zcanframe_to_mcp2515frame(msg, tx_frame);
|
||||||
mcp2515_cmd_write_reg(dev,
|
|
||||||
addr_tx_ctrl + MCP2515_ADDR_OFFSET_CTRL2FRAME,
|
/* Address Pointer selection */
|
||||||
tx_frame, sizeof(tx_frame));
|
abc = 2 * tx_idx;
|
||||||
|
|
||||||
|
mcp2515_cmd_load_tx_buffer(dev, abc, tx_frame, sizeof(tx_frame));
|
||||||
|
|
||||||
/* request tx slot transmission */
|
/* request tx slot transmission */
|
||||||
mcp2515_cmd_bit_modify(dev, addr_tx_ctrl, MCP2515_TXCTRL_TXREQ,
|
mcp2515_cmd_bit_modify(dev, addr_tx_ctrl, MCP2515_TXCTRL_TXREQ,
|
||||||
MCP2515_TXCTRL_TXREQ);
|
MCP2515_TXCTRL_TXREQ);
|
||||||
|
@ -632,7 +668,7 @@ static int mcp2515_init(struct device *dev)
|
||||||
|
|
||||||
k_sem_init(&dev_data->int_sem, 0, 1);
|
k_sem_init(&dev_data->int_sem, 0, 1);
|
||||||
k_mutex_init(&dev_data->mutex);
|
k_mutex_init(&dev_data->mutex);
|
||||||
k_sem_init(&dev_data->tx_sem, 3, 3);
|
k_sem_init(&dev_data->tx_sem, MCP2515_TX_CNT, MCP2515_TX_CNT);
|
||||||
k_sem_init(&dev_data->tx_cb[0].sem, 0, 1);
|
k_sem_init(&dev_data->tx_cb[0].sem, 0, 1);
|
||||||
k_sem_init(&dev_data->tx_cb[1].sem, 0, 1);
|
k_sem_init(&dev_data->tx_cb[1].sem, 0, 1);
|
||||||
k_sem_init(&dev_data->tx_cb[2].sem, 0, 1);
|
k_sem_init(&dev_data->tx_cb[2].sem, 0, 1);
|
||||||
|
|
|
@ -82,6 +82,7 @@ struct mcp2515_config {
|
||||||
#define MCP2515_OPCODE_WRITE 0x02
|
#define MCP2515_OPCODE_WRITE 0x02
|
||||||
#define MCP2515_OPCODE_READ 0x03
|
#define MCP2515_OPCODE_READ 0x03
|
||||||
#define MCP2515_OPCODE_BIT_MODIFY 0x05
|
#define MCP2515_OPCODE_BIT_MODIFY 0x05
|
||||||
|
#define MCP2515_OPCODE_LOAD_TX_BUFFER 0x40
|
||||||
#define MCP2515_OPCODE_READ_STATUS 0xA0
|
#define MCP2515_OPCODE_READ_STATUS 0xA0
|
||||||
#define MCP2515_OPCODE_RESET 0xC0
|
#define MCP2515_OPCODE_RESET 0xC0
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue