diff --git a/bsp/k230/drivers/interdrv/pdma/drv_pdma.c b/bsp/k230/drivers/interdrv/pdma/drv_pdma.c index c585b9945b8..192d236efea 100644 --- a/bsp/k230/drivers/interdrv/pdma/drv_pdma.c +++ b/bsp/k230/drivers/interdrv/pdma/drv_pdma.c @@ -46,6 +46,7 @@ static pdma_reg_t *pdma_reg; static size_t g_pdma_page_size[8]; static bool g_pdma_alloc_page[8]; +static rt_uint64_t saddr_high[8]; /*************************************************************** * general cfg ***************************************************************/ @@ -185,8 +186,8 @@ static rt_uint32_t *pdma_llt_cal(usr_pdma_cfg_t pdma_cfg) rt_hw_cpu_dcache_clean_invalidate_local((uint64_t*)llt_list, sizeof(pdma_llt_t)*list_num); - // return (rt_uint32_t *)llt_list; - return (void *)((char *)llt_list + PV_OFFSET); + return (rt_uint32_t *)llt_list; + // return (void *)((char *)llt_list + PV_OFFSET); } int k_pdma_config(usr_pdma_cfg_t pdma_cfg) @@ -204,7 +205,9 @@ int k_pdma_config(usr_pdma_cfg_t pdma_cfg) pdma_reg->pdma_ch_reg[ch].ch_cfg = pdma_cfg.pdma_ch_cfg; pdma_reg->ch_peri_dev_sel[ch] = pdma_cfg.device; - pdma_reg->pdma_ch_reg[ch].ch_llt_saddr = (rt_uint32_t)(intptr_t)pdma_llt_cal(pdma_cfg); + rt_uint32_t *p = pdma_llt_cal(pdma_cfg); + pdma_reg->pdma_ch_reg[ch].ch_llt_saddr = (rt_uint32_t)(intptr_t)p; + saddr_high[ch] = ((rt_uint64_t)p)>>32; return 0; } @@ -212,7 +215,8 @@ int k_pdma_config(usr_pdma_cfg_t pdma_cfg) void k_pdma_llt_free(rt_uint8_t ch) { rt_uint32_t *llt_list; - llt_list = (rt_uint32_t *)(intptr_t)pdma_reg->pdma_ch_reg[ch].ch_llt_saddr; + // llt_list = (rt_uint32_t *)(intptr_t)pdma_reg->pdma_ch_reg[ch].ch_llt_saddr; + llt_list = (rt_uint32_t *)(pdma_reg->pdma_ch_reg[ch].ch_llt_saddr + (saddr_high[ch]<<32)); if (g_pdma_alloc_page[ch]) { rt_pages_free(llt_list, g_pdma_page_size[ch]); diff --git a/bsp/k230/drivers/interdrv/uart_canaan/drv_uart.c b/bsp/k230/drivers/interdrv/uart_canaan/drv_uart.c index 57e3bf4195c..3e727f29b43 100644 --- a/bsp/k230/drivers/interdrv/uart_canaan/drv_uart.c +++ b/bsp/k230/drivers/interdrv/uart_canaan/drv_uart.c @@ -281,11 +281,45 @@ static void kd_uart_init(volatile void *uart_base, int index) static rt_err_t uart_open(rt_device_t dev, rt_uint16_t oflag) { + rt_base_t level; + + struct kd_uart_device *kd_uart_device = (struct kd_uart_device *)dev->user_data; + struct rt_serial_rx_fifo *kd_rx_fifo = kd_uart_device->kd_rx_fifo; + + // if(0x00 == kd_uart_device->dev_open_ref_cnt) { + level = rt_hw_interrupt_disable(); + + kd_rx_fifo->get_index = 0; + kd_rx_fifo->put_index = 0; + kd_rx_fifo->is_full = RT_FALSE; + + rt_hw_interrupt_enable(level); + // } + + // kd_uart_device->dev_open_ref_cnt ++; + return RT_EOK; } rt_err_t uart_close(rt_device_t dev) { + rt_base_t level; + + struct kd_uart_device *kd_uart_device = (struct kd_uart_device *)dev->user_data; + struct rt_serial_rx_fifo *kd_rx_fifo = kd_uart_device->kd_rx_fifo; + + // kd_uart_device->dev_open_ref_cnt --; + + // if(0x00 == kd_uart_device->dev_open_ref_cnt) { + level = rt_hw_interrupt_disable(); + + kd_rx_fifo->get_index = 0; + kd_rx_fifo->put_index = 0; + kd_rx_fifo->is_full = RT_FALSE; + + rt_hw_interrupt_enable(level); + // } + return RT_EOK; }