MilkV Duo256M ARM核 HWTIMER驱动调试记录

MilkV Duo256M ARM核 HWTIMER 驱动调试记录

本文记录一个在对接 cv18xx_aarch64 的 hwtimer 设备驱动时遇到的问题。

问题描述

首先该 hwtimer 设备驱动是已经对接到 c906_little 和 cv18xx_risc-v 了的,并且测试正常通过。根据芯片数据手册描述,这几个核心的外设映射地址都是相同的,只是中断号各自不同需要区分。

但是在运行测试用例时,cv18xx_aarch64 报以下错误日志

shell 复制代码
exception info:      
esr.EC :0x25   
esr.IL :0x01
esr.ISS:0x00000045 
epc    :0x000000008020154c 
Data abort     
fault addr = 0x00000000030a0008                         abort caused by write instruction                       Translation fault, first level                           Execption:                                               X00:0x00000000030a0000 X01:0x0000000000000001 X02:0x0000000080201634 X03:0x0000000000000065           X04:0x0000000000000065 X05:0x0000000000656369 X06:0x0000656c706d6173 X07:0x0000000000000001           X08:0x00000000000848e2 X09:0xffffff7f7f7f7f7f X10:0x0000000000000728 X11:0x0101010101010101           X12:0x000000000000000d X13:0x0000000000000000 X14:0xffffffffffffffff X15:0x0000000000000000           X16:0xffffffffffffffff X17:0x0000000000000000 X18:0x000000008d5ffdf0 X19:0x0000000080252694           X20:0x00000000802604b0 X21:0x0000000000000000 X22:0x0000000000000016 X23:0x0000000000000017           X24:0x0000000000000018 X25:0x0000000000000019 X26:0x000000000000001a X27:0x000000000000001b           X28:0x000000000000001c X29:0x0000000080300cf0 X30:0x000000008020168c                                   SP_EL0:0x0000000000000000                               SPSR  :0x0000000020000005                               EPC   :0x000000008020154c      

粗略判断为是写入异常导致的错误,通过反汇编快速定位异常代码:

shell 复制代码
sudo apt-get install gcc-aarch64-linux-gnu
aarch64-linux-gnu-objdump -l -S rtthread.elf > out.c

去到 0x000000008020154c:

复制代码
hal_timer_reset_register():
/home/csc/Project/rt-thread/bsp/cvitek/drivers/drv_timer.c:289
void hal_timer_reset_register(dw_timer_regs_t *timer_base)
{
    80201540:	d10043ff 	sub	sp, sp, #0x10
    80201544:	f90007e0 	str	x0, [sp, #8]
/home/csc/Project/rt-thread/bsp/cvitek/drivers/drv_timer.c:290
    timer_base->TCR = 0U;
    80201548:	f94007e0 	ldr	x0, [sp, #8]
    8020154c:	b900081f 	str	wzr, [x0, #8]
/home/csc/Project/rt-thread/bsp/cvitek/drivers/drv_timer.c:291
    timer_base->TLC = 0U;
    80201550:	f94007e0 	ldr	x0, [sp, #8]
    80201554:	b900001f 	str	wzr, [x0]
/home/csc/Project/rt-thread/bsp/cvitek/drivers/drv_timer.c:292
}

hal_timer_reset_register 实在外设操作的第一步初始化就出现了写入异常,核对芯片数据手册外设地址是没有问题。

于是去查看其他同时支持了 cv18xx_aarch64 和 cv18xx_risc-v 并可以正常运行的外设驱动有没有进行特殊处理。

在 uart 驱动中发现针对 ARCH_ARM 对外设的基地址进行了重映射

c 复制代码
    pinmux_config(BSP_UART0_RX_PINNAME, UART0_RX, pinname_whitelist_uart0_rx);
    pinmux_config(BSP_UART0_TX_PINNAME, UART0_TX, pinname_whitelist_uart0_tx);
    BSP_INSTALL_UART_DEVICE(0);
#if defined(ARCH_ARM)
    uart->hw_base = (rt_size_t)rt_ioremap((void*)uart->hw_base, 0x10000);
#endif /* defined(ARCH_ARM) */

于是在 hwtimer 也针对 ARCH_ARM 添加 rt_ioremap

c 复制代码
#if defined(ARCH_ARM)
        _timer_obj[i].base = (dw_timer_regs_t *)rt_ioremap((void*)_timer_obj[i].base, 0x10000);
#endif /* defined(ARCH_ARM) */

重新编译并运行测试用例,顺利通过。

存在的困惑

目前还不清楚为什么针对 ARCH_ARM 需要对外设的基地址进行重映射,如果有了解的大佬,欢迎留言。

相关推荐
女神下凡5 小时前
芯参谋(38):NAND_MCP_电路设计指南
arm开发·单片机·嵌入式硬件·设计规范
gwf2168 小时前
Completion Queue(CQ)与中断处理:轮询、中断聚合与错误码 —— 面向AI集群的驱动级深度剖析
驱动开发·性能调优·pcie·rdma·ai集群·中断聚合·cq
剑指offer.10 小时前
ARM裸机开发-SPI
arm开发·嵌入式硬件·嵌入式·arm
sunoo-22911 小时前
【ARM嵌入式学习笔记第十天】i.MX6ULL eLCDIF控制器驱动RGB LCD全解析(硬件原理+寄存器配置+裸机代码)
arm开发·笔记·学习
狂奔蜗牛(bradley)13 小时前
把 EtherCAT 初始化从 FPGA 搬到 ARM:命令通道的接口设计与11个坑
arm开发·人工智能·fpga开发·架构
RISCV_Explorer15 小时前
RISC-V RVV向量性能调优实战——LMUL与SEW参数选型、访存瓶颈判断与微基准方法
risc-v
kakakahahahaha15 小时前
Windows鼠标失灵排查:Ctrl Alt Delete、Mouse Keys、USB控制器与驱动修复
windows·驱动开发·电脑·笔记本电脑·软件需求
傲世仙尊17 小时前
TCP报头全解-序号确认应答与可靠性是一个准数
驱动开发·网络协议·tcp/ip
女神下凡2 天前
芯参谋(37):EEPROM_电路设计指南
arm开发·单片机·嵌入式硬件·fpga开发·设计规范
sukalot2 天前
Windows 驱动实例分析系列:libwdi 驱动分析 - libwdi 篇(五)
windows·驱动开发