TI中文支持网
TI专业的中文技术问题搜集分享网站

AM335X Pru SoftUart

我按照这个文档
http://processors.wiki.ti.com/index.php/Soft-UART_Implementation_on_AM335X_PRU_-_Software_Users_Guide
往我的内核(3.2版本)中添加了SortUart的驱动程序,内核编译的时候跑飞了

pruss_probe+
pruss->res->start=4a300000

ioaddr=e0900000

pruss_mfd pruss_mfd: mfd: added am33xx_pruss_uart device

paddress 0xe0920010

Unhandled fault: external abort on non-linefetch (0x1008) at 0xe0920010
Internal error: : 1008 [#1]

跟踪发现是pruss.c中的arm_to_pru_intr_init(pruss)中有

preg_data = ioread32(paddress)这么一个操作

判断可能是pru时钟域没有打开,但是对比了一下文档中下载的内核和我使用的内核,clockdomains33xx_data.c这个

文件是一样的,不知道打开pru时钟还需要什么操作

hongbin li1:

我在clkdm_complete_init()初始化完读了一次CM_PER_PRUSS_CLKSTCTR寄存器,值是0x2,发现pru的3个clk都没打开,有高人帮忙分析下不?

Yaoming Qin:

回复 hongbin li1:

您也看看比较新的例子 http://software-dl.ti.com/sitara_linux/esd/PRU-SWPKG/latest/index_FDS.html

hongbin li1:

回复 Yaoming Qin:

这个连接我下了pru-addon-v4.0-Windows-Install.exe,问一下那个pru/patches目录下的这些patch怎么用啊,readme中的链接点进去怎么不是使用方法呢

hongbin li1:

回复 hongbin li1:

我看了这些patch,跟设备树有关,但我的内核没有使用设备树,这些patch不适用我的内核,估计改起来工作量也很大,有好的建议吗,我是想按照

http://processors.wiki.ti.com/index.php/Soft-UART_Implementation_on_AM335X_PRU_-_Software_Users_Guide这个链接来做的

Jian Zhou:

回复 hongbin li1:

请问你用的是SDK06的内核么?检查下板级文件里PRU的初始化这部分。

hongbin li1:

回复 Jian Zhou:

我打算用pru0和mcasp1,在板级文件中配了uart和mcasp1的pinmux

static struct pinmux_config suart0_pin_mux[] = { {"spi0_d1.pr1_uart0_rxd", OMAP_MUX_MODE4 | AM33XX_SLEWCTRL_SLOW | AM33XX_PIN_INPUT_PULLUP}, {"spi0_cs0.pr1_uart0_txd", OMAP_MUX_MODE4 | AM33XX_PULL_UP | AM33XX_PULL_DISA | AM33XX_SLEWCTRL_SLOW}, {NULL, 0},};

static struct pinmux_config mcasp1_pin_mux[] = { {"mcasp0_aclkr.mcasp1_aclkx", OMAP_MUX_MODE3 | AM33XX_PIN_INPUT_PULLDOWN}, {"mcasp0_fsr.mcasp1_fsx", OMAP_MUX_MODE3 | AM33XX_PIN_INPUT_PULLDOWN}, {"mcasp0_axr1.mcasp1_axr0", OMAP_MUX_MODE3 | AM33XX_PIN_INPUT_PULLDOWN}, {"mcasp0_ahclkx.mcasp1_axr1", OMAP_MUX_MODE3 | AM33XX_PIN_INPUT_PULLDOWN}, {NULL, 0},};

static void suart0_pin_init(int evm_id, int profile){ /*config mcasp1*/ setup_pin_mux(mcasp1_pin_mux); /*config suart0*/ setup_pin_mux(suart0_pin_mux); return;}

不知道我这样配对不对,还有我在am335x_pru_suart_probe中看到

PINMUX1 = ioremap(0x44E108C8,1); iowrite32((3 | (1 << 5)),PINMUX1);

PINMUX2 = ioremap(0x44E108CC,1); iowrite32(4,PINMUX2);

不知道这又是配什么的

hongbin li1:

回复 hongbin li1:

没有人给点建议吗?下载了链接给的内核,对比了下board.c和device.c,把跟pruss相关的补上,内核还是跟之前的一样,在同一个位置飞了,还是时钟未打开

Jian Zhou:

回复 hongbin li1:

检查下这个函数am33xx_init_early(),里面有clock初始化。

hongbin li1:

回复 Jian Zhou:

感谢您的回复

我看了这两个初始化的配置,跟链接上下载的内核这两个位置对比了一下,我的内核有关pruss的时钟跟电源配置和下载到的内核配置完全一样

am33xx_powerdomains_init(); am33xx_clockdomains_init();

这是我在初始化过程中加的打印,

clockdomain: init l4_cefuse_clkdmclockdomain: init gfx_l4ls_gfx_clkdmclockdomain: init gfx_l3_clkdmclockdomain: init l4_rtc_clkdmclockdomain: init mpu_clkdmclockdomain: init l4_wkup_aon_clkdmclockdomain: init l3_aon_clkdmclockdomain: init l4_wkup_clkdmclockdomain: init clk_24mhz_clkdmclockdomain: init lcdc_clkdmclockdomain: init cpsw_125mhz_clkdmclockdomain: init pruss_ocp_clkdmclockdomain: init ocpwp_l3_clkdmclockdomain: init l4hs_clkdmclockdomain: init l3_clkdmclockdomain: init l4fw_clkdmclockdomain: init l3s_clkdmclockdomain: init l4ls_clkdm

在clock33xx_data.c中也有

CLK(NULL, "pruss_ocp_gclk", &pruss_ocp_gclk, CK_AM33XX), CLK(NULL, "pruss_uart_gclk", &pruss_uart_gclk, CK_AM33XX), CLK(NULL, "pruss_iep_gclk", &pruss_iep_gclk, CK_AM33XX),

但是,初始化完CM_PER_PRUSS_CLKSTCTRL寄存器的值还是0x2,3个时钟都是inact状态,内核在同样的位置出错

hongbin li1:

回复 hongbin li1:

pruss.c中clk_enable()调用_clkdm_clk_hwmod_enable

clockdomain: clkdm pruss_ocp_clkdm: enabled

这些初始化使能过程都有,是否跟硬件有关?

赞(0)
未经允许不得转载:TI中文支持网 » AM335X Pru SoftUart
分享到: 更多 (0)