123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346 |
- #include "include.h"
- #if UART1_EN
- typedef struct {
- volatile u8 w_cnt;
- volatile u8 r_cnt;
- u8 resv0;
- u8 resv1;
- u8 *buf;
- u32 ticks;
- } uart1_cb_t;
- static uart1_cb_t uart1_cb;
- static u8 uart1_rx_buf[64];
- vh_packet_t vh_packet;
- #if (CHARGE_BOX_INTF_SEL == INTF_UART1) || (TEST_INTF_SEL == INTF_UART1)
- AT(.com_text.bsp.uart)
- u8 bsp_uart_packet_parse(vh_packet_t *p, u8 data)
- {
- u8 recv_valid = 0, parse_done = 0;
- u8 cnt = p->cnt;
- if ((cnt == 0) && (data == 0x55)) {
- recv_valid = 1;
- } else if ((cnt == 1) && (data == 0xAA)) {
- p->header = 0xAA55;
- recv_valid = 1;
- } else if ((cnt == 2) && (data == VHOUSE_DISTINGUISH)) {
- p->distinguish = data;
- recv_valid = 1;
- } else if (cnt == 3) {
- p->cmd = data;
- recv_valid = 1;
- } else if (cnt == 4) {
- if (data <= VH_DATA_LEN) {
- p->length = data;
- recv_valid = 1;
- }
- } else if ((cnt > 4) && (cnt <= (p->length + 1 + 4))) {
- recv_valid = 1;
- if (cnt > p->length + 4) {
- p->checksum = data;
- parse_done = 1; //匹配完整充电仓命令包
- recv_valid = 0;
- } else {
- p->buf[cnt - 5] = data;
- }
- }
- if (recv_valid) {
- p->crc = crc8_tbl[p->crc ^ data];
- p->cnt++;
- } else {
- if ((parse_done) && (p->crc != p->checksum)) {
- parse_done = 0;
- }
- p->cnt = 0;
- p->crc = 0;
- }
- return parse_done;
- }
- #endif
- AT(.com_text.uart1.isr)
- static void uart1_rx_done_cb(u8 data)
- {
- #if ((CHARGE_BOX_INTF_SEL == INTF_UART1) || ((TEST_INTF_SEL == INTF_UART1) && IODM_TEST_EN))
- vh_packet_t *p = &vh_packet;
- u8 parse_done = bsp_uart_packet_parse(p,data);
- if (parse_done) {
- #if (CHARGE_BOX_INTF_SEL == INTF_UART1)
- charge_box_packet_recv();
- #endif
- #if IODM_TEST_EN && (TEST_INTF_SEL == INTF_UART1)
- iodm_packet_recv();
- #endif
- }
- #endif
- #if QTEST_EN && (TEST_INTF_SEL == INTF_UART1)
- if(QTEST_IS_ENABLE()) {
- qtest_packet_uart_recv(data);
- }
- #endif
- #if ONEMORE_SPP_TEST_EN
- u8 *rx_data = &vh_packet;
- onemore_hq51_uart_reveice_data_handle(rx_data);
- #endif
- }
- AT(.com_text.uart1.isr)
- static void uart1_isr(void)
- {
- u8 data;
- if(UART1CON & BIT(9)) {
- data = UART1DATA;
- UART1CPND = BIT(9);
- if(tick_check_expire(uart1_cb.ticks,50)){
- uart1_cb.w_cnt = uart1_cb.r_cnt = 0;
- }
- uart1_cb.ticks = tick_get();
- uart1_cb.buf[uart1_cb.w_cnt & 0x3f] = data;
- uart1_cb.w_cnt++;
- uart1_rx_done_cb(data);
- }
- }
- AT(.com_text.uart)
- u8 bsp_uart1_get(u8 *ch)
- {
- if (uart1_cb.r_cnt != uart1_cb.w_cnt) {
- *ch = uart1_cb.buf[uart1_cb.r_cnt & 0x3f];
- uart1_cb.r_cnt++;
- return 1;
- }
- return 0;
- }
- void bsp_uart1_init(u32 baudrate)
- {
- memset(&uart1_cb, 0, sizeof(uart1_cb));
- memset(&vh_packet, 0, sizeof(vh_packet));
- uart1_cb.buf = uart1_rx_buf;
- u32 baud = 0;
- if (xcfg_cb.uart1_sel == UART1_TR_PA7) {
- if (UART0_PRINTF_SEL == PRINTF_PA7) {
- FUNCMCON0 = 0x0f << 8;
- }
- GPIOADE |= BIT(7); //数字io
- GPIOAFEN |= BIT(7); //function io
- GPIOADIR |= BIT(7); //input
- }else if(xcfg_cb.uart1_sel == UART1_TR_VUSB){
- if(!sys_cb.vusb_uart_flag){
- if (UART0_PRINTF_SEL == PRINTF_VUSB) {
- FUNCMCON0 = 0x0f << 8;
- }
- PWRCON0 |= BIT(30); //Enable VUSB GPIO
- #if (CHARGE_BOX_INTF_SEL == INTF_UART1) || (QTEST_EN && (TEST_INTF_SEL == INTF_UART1))
- baudrate = 9600;
- #endif
- xcfg_cb.chg_inbox_pwrdwn_en = 0; //入仓耳机关机
- sys_cb.vusb_uart_flag = 1;
- }else{
- return;
- }
- } else if (xcfg_cb.uart1_sel == UART1_TR_PF0){
- GPIOFDE |= BIT(0); //数字io
- GPIOFFEN |= BIT(0); //function io
- GPIOFDIR |= BIT(0);
- }
- baud = ((get_sysclk_nhz() + (baudrate / 2)) / baudrate) - 1;
- CLKGAT0 |= BIT(7); //enable uart1 clk
- UART1CON = 0;
- FUNCMCON0 = (0x7 << 28) | ((xcfg_cb.uart1_sel + 1) << 24); //when RX = 0X7, TX RX共用
- UART1BAUD = (baud << 16) | baud;
- UART1CON = BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(0); //RX EN, One line, fix baud, 2 Stop bits, Uart EN
- UART1CON |= 0xaaa << 16; //KEY RESET MODE
- UART1CPND = BIT(8) | BIT(9);
- UART1CPND |= BIT(10) | BIT(15) ;
- uart1_register_isr(uart1_isr);
- }
- #endif
- #if UART2_EN
- typedef struct {
- volatile u8 w_cnt;
- volatile u8 r_cnt;
- u8 resv0;
- u8 resv1;
- u8 *buf;
- u32 ticks;
- } uart2_cb_t;
- static uart2_cb_t uart2_cb;
- static u8 uart2_rx_buf[64];
- vh_packet_t vh_packet;
- #if (CHARGE_BOX_INTF_SEL == INTF_UART2) || (TEST_INTF_SEL == INTF_UART2)
- AT(.com_text.bsp.uart)
- u8 bsp_uart_packet_parse(vh_packet_t *p, u8 data)
- {
- u8 recv_valid = 0, parse_done = 0;
- u8 cnt = p->cnt;
- if ((cnt == 0) && (data == 0x55)) {
- recv_valid = 1;
- } else if ((cnt == 1) && (data == 0xAA)) {
- p->header = 0xAA55;
- recv_valid = 1;
- } else if ((cnt == 2) && (data == VHOUSE_DISTINGUISH)) {
- p->distinguish = data;
- recv_valid = 1;
- } else if (cnt == 3) {
- p->cmd = data;
- recv_valid = 1;
- } else if (cnt == 4) {
- if (data <= VH_DATA_LEN) {
- p->length = data;
- recv_valid = 1;
- }
- } else if ((cnt > 4) && (cnt <= (p->length + 1 + 4))) {
- recv_valid = 1;
- if (cnt > p->length + 4) {
- p->checksum = data;
- parse_done = 1; //匹配完整充电仓命令包
- recv_valid = 0;
- } else {
- p->buf[cnt - 5] = data;
- }
- }
- if (recv_valid) {
- p->crc = crc8_tbl[p->crc ^ data];
- p->cnt++;
- } else {
- if ((parse_done) && (p->crc != p->checksum)) {
- parse_done = 0;
- }
- p->cnt = 0;
- p->crc = 0;
- }
- return parse_done;
- }
- #endif
- AT(.com_text.uart2.isr)
- static void uart2_rx_done_cb(u8 data)
- {
- #if ((CHARGE_BOX_INTF_SEL == INTF_UART2) || ((TEST_INTF_SEL == INTF_UART2) && IODM_TEST_EN))
- vh_packet_t *p = &vh_packet;
- u8 parse_done = bsp_uart_packet_parse(p,data);
- if (parse_done) {
- #if (CHARGE_BOX_INTF_SEL == INTF_UART2)
- charge_box_packet_recv();
- #endif
- #if IODM_TEST_EN && (TEST_INTF_SEL == INTF_UART2)
- iodm_packet_recv();
- #endif
- }
- #endif
- #if QTEST_EN && (TEST_INTF_SEL == INTF_UART2)
- if(QTEST_IS_ENABLE()) {
- qtest_packet_uart_recv(data);
- }
- #endif
- }
- AT(.com_text.uart2.isr)
- static void uart2_isr(void)
- {
- u8 data;
- if(UART2CON & BIT(9)) {
- data = UART2DATA;
- UART2CPND = BIT(9);
- if(tick_check_expire(uart2_cb.ticks,50)){
- uart2_cb.w_cnt = uart2_cb.r_cnt = 0;
- }
- uart2_cb.ticks = tick_get();
- uart2_cb.buf[uart2_cb.w_cnt & 0x3f] = data;
- uart2_cb.w_cnt++;
- uart2_rx_done_cb(data);
- }
- }
- AT(.com_text.uart)
- u8 bsp_uart2_get(u8 *ch)
- {
- if (uart2_cb.r_cnt != uart2_cb.w_cnt) {
- *ch = uart2_cb.buf[uart2_cb.r_cnt & 0x3f];
- uart2_cb.r_cnt++;
- return 1;
- }
- return 0;
- }
- void bsp_uart2_init(u32 baudrate)
- {
- memset(&uart2_cb, 0, sizeof(uart2_cb));
- memset(&vh_packet, 0, sizeof(vh_packet));
- uart2_cb.buf = uart2_rx_buf;
- u32 baud = 0;
- if (xcfg_cb.uart2_sel == UART2_TR_PB2) {
- if (UART0_PRINTF_SEL == PRINTF_PB2) {
- FUNCMCON0 = 0x0f << 8;
- }
- GPIOBDE |= BIT(2);
- GPIOBFEN |= BIT(2);
- GPIOBDIR |= BIT(2);
- }else if(xcfg_cb.uart2_sel == UART2_TR_VUSB){
- if(!sys_cb.vusb_uart_flag){
- if (UART0_PRINTF_SEL == PRINTF_VUSB) {
- FUNCMCON0 = 0x0f << 8;
- }
- PWRCON0 |= BIT(30); //Enable VUSB GPIO
- #if (CHARGE_BOX_INTF_SEL == INTF_UART2) || (QTEST_EN && (TEST_INTF_SEL == INTF_UART2))
- baudrate = 9600;
- #endif
- xcfg_cb.chg_inbox_pwrdwn_en = 0; //入仓耳机关机
- sys_cb.vusb_uart_flag = 1;
- }else{
- return;
- }
- } else if (xcfg_cb.uart2_sel == UART2_TR_PE7){
- GPIOEDE |= BIT(7);
- GPIOEFEN |= BIT(7);
- GPIOEDIR |= BIT(7);
- }
- baud = ((get_sysclk_nhz() + (baudrate / 2)) / baudrate) - 1;
- CLKGAT0 |= BIT(8); //enable uart2 clk
- UART2CON = 0;
- FUNCMCON2 = (0x03 << 12) | ((xcfg_cb.uart2_sel + 1) << 8); //when RX = 0X3, TX RX共用
- UART2BAUD = (baud << 16) | baud;
- UART2CON = BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(0); //RX EN, One line, fix baud, 2 Stop bits, Uart EN
- UART2CON |= 0xaaa << 16; //KEY RESET MODE
- UART2CPND = BIT(8) | BIT(9);
- UART2CPND |= BIT(10) | BIT(15) ;
- uart2_register_isr(uart2_isr);
- }
- #endif
- void set_vusb_uart_flag(u8 flag)
- {
- sys_cb.vusb_uart_flag = flag;
- }
- void bsp_vusb_uart_dis(void)
- {
- PWRCON0 &= ~BIT(30); //disable VUSB GPIO
- // UART1CON = 0;
- CLKGAT0 &= ~BIT(7); //disable uart1 clk
- sys_cb.vusb_uart_flag = 0;
- }
|