hpm_canopen.h 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. * Copyright (c) 2023-2024 HPMicro
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. *
  6. */
  7. #include <stdio.h>
  8. #include <assert.h>
  9. #include "board.h"
  10. #include "hpm_sysctl_drv.h"
  11. #ifdef HPMSOC_HAS_HPMSDK_MCAN
  12. #include "hpm_mcan_drv.h"
  13. #include "hpm_canopen_mcan.h"
  14. #else
  15. #include "hpm_can_drv.h"
  16. #include "hpm_canopen_can.h"
  17. #endif
  18. #include "can.h"
  19. #include "canopennode.h"
  20. #include "CANopen.h"
  21. #include "CO_driver.h"
  22. #include "canopen_errno.h"
  23. #ifdef HPMSOC_HAS_HPMSDK_MCAN
  24. #define HPM_CAN_EXT_FILTER_NUM_MAX (64U)
  25. #define HPM_CAN_STD_FILTER_NUM_MAX (128U)
  26. #define HPM_MCAN_NUM_TX_BUF_ELEMENTS (32U)
  27. #define HPM_MCAN_NUM_RX_BUF_ELEMENTS (16U)
  28. #else
  29. #define HPM_CAN_NUM_TX_BUF_ELEMENTS (2U)
  30. #define HPM_CAN_FILTER_NUM_MAX (16U)
  31. #endif
  32. struct hpm_can_config {
  33. #ifdef HPMSOC_HAS_HPMSDK_MCAN
  34. MCAN_Type *base;
  35. #else
  36. CAN_Type *base;
  37. #endif
  38. };
  39. struct hpm_can_data {
  40. struct can_driver_config common;
  41. #ifdef HPMSOC_HAS_HPMSDK_MCAN
  42. mcan_config_t config;
  43. uint32_t ext_filter_count;
  44. uint16_t ext_filters_index[HPM_CAN_EXT_FILTER_NUM_MAX];
  45. mcan_filter_elem_t ext_filters[HPM_CAN_EXT_FILTER_NUM_MAX];
  46. uint32_t std_filter_count;
  47. uint16_t std_filters_index[HPM_CAN_STD_FILTER_NUM_MAX];
  48. mcan_filter_elem_t std_filters[HPM_CAN_STD_FILTER_NUM_MAX];
  49. /* RX callback */
  50. can_rx_callback_t rx_cb_ext[HPM_CAN_EXT_FILTER_NUM_MAX];
  51. void *rx_cb_arg_ext[HPM_CAN_EXT_FILTER_NUM_MAX];
  52. can_rx_callback_t rx_cb_std[HPM_CAN_STD_FILTER_NUM_MAX];
  53. void *rx_cb_arg_std[HPM_CAN_STD_FILTER_NUM_MAX];
  54. /* TX callback */
  55. can_tx_callback_t tx_fin_cb[HPM_MCAN_NUM_TX_BUF_ELEMENTS];
  56. void *tx_fin_cb_arg[HPM_MCAN_NUM_TX_BUF_ELEMENTS];
  57. #else
  58. can_config_t config;
  59. uint32_t can_filter_count;
  60. can_filter_config_t filter_list[HPM_CAN_FILTER_NUM_MAX];
  61. /* RX callback */
  62. can_rx_callback_t rx_cb[HPM_CAN_FILTER_NUM_MAX];
  63. void *rx_cb_arg[HPM_CAN_FILTER_NUM_MAX];
  64. /* TX callback */
  65. can_tx_callback_t tx_fin_cb[HPM_CAN_NUM_TX_BUF_ELEMENTS];
  66. void *tx_fin_cb_arg[HPM_CAN_NUM_TX_BUF_ELEMENTS];
  67. #endif
  68. uint32_t filter_rtr;
  69. uint32_t filter_rtr_mask;
  70. /* State change callback */
  71. can_state_change_callback_t state_change_cb;
  72. void *state_change_cb_data;
  73. volatile bool has_sent_out;
  74. bool started;
  75. };
  76. #ifdef HPMSOC_HAS_HPMSDK_MCAN
  77. void canopen_init(struct canopen_context *CANdriverState, MCAN_Type *canptr, uint32_t baudrate);
  78. #else
  79. void canopen_init(struct canopen_context *CANdriverState, CAN_Type *canptr, uint32_t baudrate);
  80. #endif
  81. void enable_can_interrupt(void);
  82. void config_leds(CO_NMT_t *nmt);
  83. CO_SDO_abortCode_t odf_2102(CO_ODF_arg_t *odf_arg);