主题: ADS8568中讨论的其他器件
工具/软件:
我正在尝试使用 AM5729的 GPMC 以并行模式从 ADS8568读取数据。
在连接 ADS8568之前、我通过检查 CS 引脚信号来尝试测试 GPMC 操作。
然而,我没有观察到任何信号,并且有一个错误消息中dmesg
.
[ 2534.408285] 44000000.ocp:L3 Custom Error: MASTER DSP1_MDMA TARGET GPMC (Read): Data Access in User mode during Functional access [ 2534.408291] Modules linked in: rpmsg_rpc rpmsg_proto xt_state xt_conntrack nft_counter pru_rproc nft_meta pruss_intc nft_chain_nat_ipv4 nf_tables_ipv4 ipt_MASQUERADE nf_nat_masquerade_ipv4 nft_compat bnep pruss pruss_soc_bus btsdio ti_vpe bluetooth ti_sc videobuf2_dma_contig ti_csc ti_vpdma v4l2_mem2mem v4l2_common videobuf2_memops videobuf2_v4l2 videobuf2_core videodev media ecdh_generic brcmfmac brcmutil cfg80211 omap_remoteproc virtio_rpmsg_bus rpmsg_core usb_f_ecm usb_f_mass_storage usb_f_rndis u_ether libcomposite uio_pdrv_genirq uio cmemk(O) [ 2534.408530] CPU: 0 PID: 0 Comm: swapper/0 Tainted: G W O 4.14.108-ti-r131 #1buster [ 2534.408536] Hardware name: Generic DRA74X (Flattened Device Tree) [ 2534.408559] [<c0112de8>] (unwind_backtrace) from [<c010d6a8>] (show_stack+0x20/0x24) [ 2534.408573] [<c010d6a8>] (show_stack) from [<c0c982a4>] (dump_stack+0x80/0x94) [ 2534.408588] [<c0c982a4>] (dump_stack) from [<c013fbb8>] (__warn+0xec/0x114) [ 2534.408600] [<c013fbb8>] (__warn) from [<c013fc38>] (warn_slowpath_fmt+0x58/0x74) [ 2534.408613] [<c013fc38>] (warn_slowpath_fmt) from [<c0736434>] (l3_interrupt_handler+0x368/0x3a4) [ 2534.408629] [<c0736434>] (l3_interrupt_handler) from [<c01ac04c>] (__handle_irq_event_percpu+0x84/0x2d0) [ 2534.408642] [<c01ac04c>] (__handle_irq_event_percpu) from [<c01ac2d4>] (handle_irq_event_percpu+0x3c/0x90) [ 2534.408653] [<c01ac2d4>] (handle_irq_event_percpu) from [<c01ac370>] (handle_irq_event+0x48/0x6c) [ 2534.408666] [<c01ac370>] (handle_irq_event) from [<c01b030c>] (handle_fasteoi_irq+0xd0/0x178) [ 2534.408678] [<c01b030c>] (handle_fasteoi_irq) from [<c01ab15c>] (generic_handle_irq+0x34/0x44) [ 2534.408689] [<c01ab15c>] (generic_handle_irq) from [<c01ab76c>] (__handle_domain_irq+0x8c/0xfc) [ 2534.408702] [<c01ab76c>] (__handle_domain_irq) from [<c01015bc>] (gic_handle_irq+0x4c/0x88) [ 2534.408714] [<c01015bc>] (gic_handle_irq) from [<c0cb434c>] (__irq_svc+0x6c/0xa8) [ 2534.408721] Exception stack(0xc1301ee0 to 0xc1301f28) [ 2534.408732] 1ee0: 00000000 c109e3a4 fe600000 00000000 ffffe000 c1305ea0 c1305e3c c13dd1e1 [ 2534.408742] 1f00: c0fc2f50 00000001 c1278a28 c1301f3c c1301f1c c1301f30 c01306c8 c0109a2c [ 2534.408749] 1f20: 60070013 ffffffff [ 2534.408763] [<c0cb434c>] (__irq_svc) from [<c0109a2c>] (arch_cpu_idle+0x30/0x4c) [ 2534.408775] [<c0109a2c>] (arch_cpu_idle) from [<c0cb37bc>] (default_idle_call+0x38/0x3c) [ 2534.408788] [<c0cb37bc>] (default_idle_call) from [<c018d748>] (do_idle+0x10c/0x148) [ 2534.408801] [<c018d748>] (do_idle) from [<c018da80>] (cpu_startup_entry+0x28/0x2c) [ 2534.408814] [<c018da80>] (cpu_startup_entry) from [<c0cacca0>] (rest_init+0xd4/0xd8) [ 2534.408830] [<c0cacca0>] (rest_init) from [<c1200e9c>] (start_kernel+0x420/0x448) [ 2534.408841] ---[ end trace 77d87014de97e676 ]---
下面是我的 Remoteproc 固件代码。
GPMC 初始化代码。
#define GPMC_BASE_ADDR 0x14000000 volatile int16_t *ads_data = (volatile int16_t*) (GPMC_BASE_ADDR); void gpmcInit() { // pinMux - data line uint32_t offsets[16] = { CTRL_CORE_PAD_GPMC_AD0, CTRL_CORE_PAD_GPMC_AD1, CTRL_CORE_PAD_GPMC_AD2, CTRL_CORE_PAD_GPMC_AD3, CTRL_CORE_PAD_GPMC_AD4, CTRL_CORE_PAD_GPMC_AD5, CTRL_CORE_PAD_GPMC_AD6, CTRL_CORE_PAD_GPMC_AD7, CTRL_CORE_PAD_GPMC_AD8, CTRL_CORE_PAD_GPMC_AD9, CTRL_CORE_PAD_GPMC_AD10, CTRL_CORE_PAD_GPMC_AD11, CTRL_CORE_PAD_GPMC_AD12, CTRL_CORE_PAD_GPMC_AD13, CTRL_CORE_PAD_GPMC_AD14, CTRL_CORE_PAD_GPMC_AD15, }; int i = 0; for (; i < 16; ++i) { HW_WR_FIELD32(SOC_CORE_PAD_IO_REGISTERS_BASE+offsets[i], CTRL_CORE_PAD_GPMC_AD0_GPMC_AD0_MUXMODE, // 0 ~ 15 모두 같은 값 CTRL_CORE_PAD_GPMC_AD0_GPMC_AD0_MUXMODE_GPMC_AD0_0// 0 ~ 15 모두 같은 값 ); HW_WR_FIELD32(SOC_CORE_PAD_IO_REGISTERS_BASE+offsets[i], CTRL_CORE_PAD_GPMC_AD0_GPMC_AD0_INPUTENABLE, // 0 ~ 15 모두 같은 값 CTRL_CORE_PAD_GPMC_AD0_GPMC_AD0_INPUTENABLE_ENABLE// 0 ~ 15 모두 같은 값 ); } // pinMux - CS3 HW_WR_FIELD32(SOC_CORE_PAD_IO_REGISTERS_BASE+CTRL_CORE_PAD_GPMC_CS3, CTRL_CORE_PAD_GPMC_CS3_GPMC_CS3_MUXMODE, CTRL_CORE_PAD_GPMC_CS3_GPMC_CS3_MUXMODE_GPMC_CS3_0); HW_WR_FIELD32(SOC_CORE_PAD_IO_REGISTERS_BASE+CTRL_CORE_PAD_GPMC_CS3, CTRL_CORE_PAD_GPMC_CS3_GPMC_CS3_INPUTENABLE, CTRL_CORE_PAD_GPMC_CS3_GPMC_CS3_INPUTENABLE_DISABLE); // pinMux - oe HW_WR_FIELD32(SOC_CORE_PAD_IO_REGISTERS_BASE+CTRL_CORE_PAD_GPMC_OEN_REN, CTRL_CORE_PAD_GPMC_OEN_REN_GPMC_OEN_REN_MUXMODE, CTRL_CORE_PAD_GPMC_OEN_REN_GPMC_OEN_REN_MUXMODE_GPMC_OEN_REN_0); HW_WR_FIELD32(SOC_CORE_PAD_IO_REGISTERS_BASE+CTRL_CORE_PAD_GPMC_OEN_REN, CTRL_CORE_PAD_GPMC_OEN_REN_GPMC_OEN_REN_INPUTENABLE, CTRL_CORE_PAD_GPMC_OEN_REN_GPMC_OEN_REN_INPUTENABLE_DISABLE); Log_print0(Diags_INFO, "GPMC Pin Mux Configured"); // prcm - gpmc volatile UInt32 *prcm_gpmc = (UInt32*) (SOC_CORE_CM_CORE_BASE + CM_L3MAIN1_GPMC_CLKCTRL); HW_WR_REG32(prcm_gpmc, CM_L3MAIN1_GPMC_CLKCTRL_MODULEMODE_AUTO); while (HW_RD_FIELD32(prcm_gpmc, CM_L3MAIN1_GPMC_CLKCTRL_IDLEST)); Log_print0(Diags_INFO, "GPMC Clock enabled"); GPMCTimeOutFeatureConfig(SOC_GPMC_CONF_REGS_BASE, GPMC_TIMEOUTFEATURE_ENABLE); GPMCTimeOutStartValSet(SOC_GPMC_CONF_REGS_BASE, 2000); // async / nor / nonmultiplexed GPMCIdleModeSelect(SOC_GPMC_CONF_REGS_BASE, GPMC_IDLEMODE_NOIDLE); GPMCDevTypeSelect(SOC_GPMC_CONF_REGS_BASE, GPMC_CHIP_SELECT_3, GPMC_DEVICETYPE_NORLIKE); GPMCDevSizeSelect(SOC_GPMC_CONF_REGS_BASE, GPMC_CHIP_SELECT_3, GPMC_DEVICESIZE_16BITS); GPMCReadTypeSelect(SOC_GPMC_CONF_REGS_BASE, GPMC_CHIP_SELECT_3, GPMC_READTYPE_ASYNC); // burst / single GPMCAccessTypeSelect(SOC_GPMC_CONF_REGS_BASE, GPMC_CHIP_SELECT_3, GPMC_MODE_READ, GPMC_ACCESSTYPE_SINGLE); Log_print0(Diags_INFO, "GPMC Dev Set"); // timing GPMCCSTimingConfig( SOC_GPMC_CONF_REGS_BASE, /* Base */ GPMC_CHIP_SELECT_3, GPMC_CS_TIMING_CONFIG( 0x12, /* CSWrOffTime = 18 */ 0x12, /* CSRdOffTime = 18 */ GPMC_CS_EXTRA_NODELAY, /* Delay 없음 */ 0x00 /* 시작부터 CS assert */ ) ); GPMCWEAndOETimingConfig( SOC_GPMC_CONF_REGS_BASE, GPMC_CHIP_SELECT_3, GPMC_WE_OE_TIMING_CONFIG( 0, /* WEOffTime - 무시 */ GPMC_WE_EXTRA_NODELAY, /* WEExtDelayFlag */ 0, /* WEOnTime - 무시 */ 0, /* OEAADMuxOffTime - 사용 안함 */ 16, /* OEOffTime */ GPMC_OE_EXTRA_NODELAY, /* OEExtDelayFlag */ 0, /* OEAADMuxOnTime - 사용 안함 */ 10 /* OEOnTime */ ) ); GPMCRdAccessAndCycleTimeTimingConfig( SOC_GPMC_CONF_REGS_BASE, GPMC_CHIP_SELECT_3, GPMC_RDACCESS_CYCLETIME_TIMING_CONFIG( 0x20, /* rdCycleTime = 32 GPMC_FCLK cycles (전체 read 사이클 길이) */ 0x20, /* wrCycleTime = 32 GPMC_FCLK cycles (전체 write 사이클 길이) */ 0x10, /* rdAccessTime = 16 GPMC_FCLK cycles (OE# 이후 데이터 유효 시점) */ 0x00 /* pageBurstAccessTime = 0 (사용 안함, burst mode off) */ ) ); GPMCycle2CycleAndTurnArndTimeTimingConfig( SOC_GPMC_CONF_REGS_BASE, GPMC_CHIP_SELECT_3, GPMC_CYCLE2CYCLE_BUSTURNAROUND_TIMING_CONFIG( 0x01, /* 트랜잭션 간 대기 시간 (1 GPMC_FCLK 사이클) */ 1, /* 같은 CS를 사용하는 연속 트랜잭션 간 대기 적용 (사용함) */ 1, /* 다른 CS를 사용하는 연속 트랜잭션 간 대기 적용 (사용함) */ 0x02 /* 버스 전환 시간 (예: Write → Read 전환 시 2 GPMC_FCLK 대기) */ ) ); Log_print0(Diags_INFO, "GPMC Timing Set"); // GPMCWaitPinMonitoringConfig(SOC_GPMC_CONF_REGS_BASE, GPMC_CHIP_SELECT_3, GPMC_MODE_READ, GPMC_WAITMONITORING_DISABLE); // Log_print0(Diags_INFO, "GPMC Wait Monitoring DISABLE"); GPMCCSConfig(SOC_GPMC_CONF_REGS_BASE, GPMC_CHIP_SELECT_3, GPMC_CS_DISABLE); GPMCBaseAddrSet(SOC_GPMC_CONF_REGS_BASE, GPMC_CHIP_SELECT_3, 0x11); GPMCMaskAddrSet(SOC_GPMC_CONF_REGS_BASE, GPMC_CHIP_SELECT_3, GPMC_CS_SIZE_16MB); GPMCCSConfig(SOC_GPMC_CONF_REGS_BASE, GPMC_CHIP_SELECT_3, GPMC_CS_ENABLE); Log_print0(Diags_INFO, "GPMC Configured"); Log_print1(Diags_INFO, "GPMC PRCM : %x", SOC_CORE_CM_CORE_BASE + CM_L3MAIN1_GPMC_CLKCTRL); Log_print1(Diags_INFO, "GPMC GPMC_CONFIG7_3 : %x", SOC_GPMC_CONF_REGS_BASE + GPMC_CONFIG7_N(GPMC_CHIP_SELECT_3)); }
读取地址"0x1400_0000"
CacheP_Inv((void*) ads_data, sizeof(int16_t)); int16_t value = ads_data[0]; Log_print1(Diags_INFO, "Value: (%d)", value);
根据我的理解、"L3自定义错误"意味着 GPMC 返回了从器件响应错误。
如果我的 GPMC 初始化过程有任何问题、请告诉我、以便我可以修复。 如果不是、我希望获得有关如何解决此问题的任何建议