int CAN_device_init(uint8_t channel, uint32_t baud)
{
	pr_info("Initializing CAN");
	pr_info_int(channel);
	pr_info_int_msg(" with baud rate ", baud);

	if (!initQueues()) {
		pr_info("CAN init queues failed\r\n");
		return 0;
	}

	switch (channel) {
	case 0:
		CAN_device_init_1(baud);
		break;
	case 1:
		CAN_device_init_2(baud);
		break;
	default:
		pr_info("CAN init device failed\r\n");
		return 0;
	}

	/* Clear out all filter values except 0.  It accepts all. */
	CAN_device_set_filter(channel, 0, 1, 0, 0, true);
	for (size_t i = 1; i < CAN_FILTER_COUNT; ++i)
		CAN_device_set_filter(channel, i, 0, 0, 0, false);

	pr_info("CAN init success!\r\n");
	return 1;
}
static void CAN_device_init_1(int baud)
{
    CAN_DeInit(CAN1);

    /* CAN GPIOs configuration ************************************************* */
    /* Enable GPIO clock */
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE);

    /* Connect CAN pins to Alternate Function */
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_9);
    GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_9);
    initGPIO(GPIOB, GPIO_Pin_8 | GPIO_Pin_9);

    /* CAN configuration ******************************************************* */
    /* Enable CAN clock */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);

    initCAN(CAN1, baud);

    //set default filter
    CAN_device_set_filter(0, 0, 0, 0, 0);

    /* Enable FIFO 0 message pending Interrupt */
    CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);

    initCANInterrupts(CAN1, USB_LP_CAN1_RX0_IRQn);
}
int CAN_set_filter(uint8_t channel, uint8_t id, uint8_t extended,
		   uint32_t filter, uint32_t mask, const bool enabled)
{
	return CAN_device_set_filter(channel, id, extended, filter,
				     mask, enabled);
}