diff --git a/bsp/raspberry-pi/raspi4-32/driver/board.c b/bsp/raspberry-pi/raspi4-32/driver/board.c index c9571316d1477dd1bf008f2c429521ea2143e68c..56b07d9f05ae9af67b8849fa6275d89abb515cf7 100644 --- a/bsp/raspberry-pi/raspi4-32/driver/board.c +++ b/bsp/raspberry-pi/raspi4-32/driver/board.c @@ -17,6 +17,12 @@ #include "cp15.h" #include "mmu.h" #include "mbox.h" +#include "ioremap.h" + + +uint8_t *mac_reg_base_addr = (uint8_t *)MAC_REG; +uint8_t *eth_send_no_cache = (uint8_t *)SEND_DATA_NO_CACHE; +uint8_t *eth_recv_no_cache = (uint8_t *)RECV_DATA_NO_CACHE; struct mem_desc platform_mem_desc[] = { {0x0, 0x6400000, 0x0, NORMAL_MEM}, @@ -91,4 +97,8 @@ void rt_hw_board_init(void) #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); #endif + + mac_reg_base_addr = (void*)rt_ioremap((void*)MAC_REG,0x80000); + eth_send_no_cache = (void*)rt_ioremap((void*)SEND_DATA_NO_CACHE,0x200000); + eth_recv_no_cache = (void*)rt_ioremap((void*)RECV_DATA_NO_CACHE,0x200000); } diff --git a/bsp/raspberry-pi/raspi4-32/driver/drv_eth.c b/bsp/raspberry-pi/raspi4-32/driver/drv_eth.c index 163f58c1501792bf15d76ff59fdf9040ce9c0ca3..8d3f5e63731bc62695deef182fd918b6519072fe 100644 --- a/bsp/raspberry-pi/raspi4-32/driver/drv_eth.c +++ b/bsp/raspberry-pi/raspi4-32/driver/drv_eth.c @@ -1,6 +1,6 @@ /* - * Copyright (c) 2006-2020, RT-Thread Development Team + * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -97,7 +97,7 @@ static void eth_rx_irq(int irq, void *param) if (val & GENET_IRQ_TXDMA_DONE) { - rt_sem_release(&send_finsh_sem_lock); + rt_sem_release(&send_finsh_sem_lock); } } @@ -447,9 +447,9 @@ static rt_uint32_t bcmgenet_gmac_eth_recv(rt_uint8_t **packetp) * RBUF_ALIGN_2B */ - //Convert to memory address - addr = addr + eth_recv_no_cache - RECV_DATA_NO_CACHE; - rt_hw_cpu_dcache_invalidate(addr,length); + //Convert to memory address + addr = addr + eth_recv_no_cache - RECV_DATA_NO_CACHE; + rt_hw_cpu_dcache_invalidate(addr,length); *packetp = (rt_uint8_t *)(addr + RX_BUF_OFFSET); @@ -495,7 +495,7 @@ static int bcmgenet_gmac_eth_send(rt_uint32_t packet, int length,struct pbuf *p) tx_index ++; if(tx_index >= TX_DESCS) { - tx_index = 0; + tx_index = 0; } prod_index = prod_index + 1; @@ -626,7 +626,7 @@ rt_err_t rt_eth_tx(rt_device_t device, struct pbuf *p) if (link_flag == 1) { bcmgenet_gmac_eth_send((rt_uint32_t)eth_send_no_cache, p->tot_len,p); - rt_sem_take(&send_finsh_sem_lock,RT_WAITING_FOREVER); + rt_sem_take(&send_finsh_sem_lock,RT_WAITING_FOREVER); } return RT_EOK; @@ -643,8 +643,8 @@ struct pbuf *rt_eth_rx(rt_device_t device) if (recv_len > 0) { pbuf = pbuf_alloc(PBUF_LINK, recv_len, PBUF_RAM); - if(pbuf) - rt_memcpy(pbuf->payload, addr_point, recv_len); + if(pbuf) + rt_memcpy(pbuf->payload, addr_point, recv_len); } } return pbuf; diff --git a/bsp/raspberry-pi/raspi4-32/driver/ioremap.c b/bsp/raspberry-pi/raspi4-32/driver/ioremap.c new file mode 100644 index 0000000000000000000000000000000000000000..6e8e18614bb0327e7e08a7d711e0a403bb697738 --- /dev/null +++ b/bsp/raspberry-pi/raspi4-32/driver/ioremap.c @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-05-06 Jesven first version + */ +#include +#include + +#ifdef RT_USING_USERSPACE +#include +#include +#endif + +#include + +#ifdef RT_USING_USERSPACE +static struct lwp_avl_struct *k_map_area; +extern rt_mmu_info mmu_info; + +static void _iounmap_range(void *addr, size_t size) +{ + void *va = RT_NULL, *pa = RT_NULL; + int i = 0; + + for (va = addr, i = 0; i < size; va = (void *)((char *)va + ARCH_PAGE_SIZE), i += ARCH_PAGE_SIZE) + { + pa = rt_hw_mmu_v2p(&mmu_info, va); + if (pa) + { + rt_hw_mmu_unmap(&mmu_info, va, ARCH_PAGE_SIZE); + } + } +} + +static void *_ioremap_type(void *paddr, size_t size, int type) +{ + rt_base_t level; + void *v_addr = NULL; + size_t attr; + + switch (type) + { + case MM_AREA_TYPE_PHY: + attr = MMU_MAP_K_DEVICE; + break; + case MM_AREA_TYPE_PHY_CACHED: + attr = MMU_MAP_K_RWCB; + break; + default: + return v_addr; + } + + level = rt_hw_interrupt_disable(); + v_addr = rt_hw_mmu_map(&mmu_info, 0, paddr, size, attr); + if (v_addr) + { + int ret = lwp_map_area_insert(&k_map_area, (size_t)v_addr, size, type); + if (ret != 0) + { + _iounmap_range(v_addr, size); + v_addr = NULL; + } + } + rt_hw_interrupt_enable(level); + return v_addr; +} + +void *rt_ioremap(void *paddr, size_t size) +{ + return _ioremap_type(paddr, size, MM_AREA_TYPE_PHY); +} + +void *rt_ioremap_nocache(void *paddr, size_t size) +{ + return _ioremap_type(paddr, size, MM_AREA_TYPE_PHY); +} + +void *rt_ioremap_cached(void *paddr, size_t size) +{ + return _ioremap_type(paddr, size, MM_AREA_TYPE_PHY_CACHED); +} + +#else + +void *rt_ioremap(void *paddr, size_t size) +{ + return paddr; +} + +void *rt_ioremap_nocache(void *paddr, size_t size) +{ + return paddr; +} + +void *rt_ioremap_cached(void *paddr, size_t size) +{ + return paddr; +} + +#endif + +void rt_iounmap(volatile void *vaddr) +{ +#ifdef RT_USING_USERSPACE + rt_base_t level; + struct lwp_avl_struct *ma_avl_node; + + level = rt_hw_interrupt_disable(); + ma_avl_node = lwp_map_find(k_map_area, (size_t)vaddr); + if (ma_avl_node) + { + struct rt_mm_area_struct *ma = (struct rt_mm_area_struct *)ma_avl_node->data; + + _iounmap_range((void *)ma->addr, ma->size); + lwp_map_area_remove(&k_map_area, (size_t)vaddr); + } + rt_hw_interrupt_enable(level); +#endif +} diff --git a/bsp/raspberry-pi/raspi4-32/driver/ioremap.h b/bsp/raspberry-pi/raspi4-32/driver/ioremap.h new file mode 100644 index 0000000000000000000000000000000000000000..563883e69cb2f8ea6c81ca398e9c8ea6f3726599 --- /dev/null +++ b/bsp/raspberry-pi/raspi4-32/driver/ioremap.h @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-05-06 Jesven first version + */ +#ifndef __IOREMAP_H__ +#define __IOREMAP_H__ + +#ifdef __cplusplus +extern "C" { +#endif + +void *rt_ioremap(void *paddr, size_t size); +void *rt_ioremap_nocache(void *paddr, size_t size); +void *rt_ioremap_cached (void *paddr, size_t size); +void rt_iounmap(volatile void *addr); + +#ifdef __cplusplus +} +#endif + +#endif /*__LWP_IOREMAP_H__*/ diff --git a/bsp/raspberry-pi/raspi4-32/driver/raspi4.h b/bsp/raspberry-pi/raspi4-32/driver/raspi4.h index bba81ea311eb11cc67b75b9225bc3c9c2bf08928..55de39ba5ddc4827e43c57a9905e6ef0d4732e8a 100644 --- a/bsp/raspberry-pi/raspi4-32/driver/raspi4.h +++ b/bsp/raspberry-pi/raspi4-32/driver/raspi4.h @@ -171,6 +171,15 @@ typedef enum { #define BSC5_BASE (PER_BASE + BSC5_BASE_OFFSET) #define BSC6_BASE (PER_BASE + BSC6_BASE_OFFSET) + +#define MAC_REG (0xfd580000) +extern uint8_t * mac_reg_base_addr; +#define SEND_DATA_NO_CACHE (0x08200000) +extern uint8_t * eth_send_no_cache; +#define RECV_DATA_NO_CACHE (0x08400000) +extern uint8_t * eth_recv_no_cache; + + /* the basic constants and interfaces needed by gic */ rt_inline rt_uint32_t platform_get_gic_dist_base(void) {