Hello, we developed a custom board using AM3359 and we get this weird issue where the CPU is completely stuck and the device becomes unusable, LEDs stop blinking, the serial doesn't output anything and doesn't accept any input, only a reset makes it work again.
This happens especially when trasfering big files via SSH (read and write) or applying software updates (eMMC block intensive write), while most of the time it works fine. The hang also happens only when the CPU frequency is higher and after many tries this seems the pattern (locking the frequency with userspace governor):
- 300MHz -> never hangs
- 600MHz -> rarely hangs
- 720MHz -> almost always hangs
- 800MHz -> almost always hangs
We thought it could be a problem with the eMMC memory but we tried trasfering files via FTP and it works fine and never hangs.
I tried writing a good portion of the eMMC and reading it back with dd with a big file and still the CPU never was stuck.
So we thought it might be related to the hardware crypto coprocessor as SSH encrypts the traffic. I tried removing the kernel modules with these commands:
# modprobe -r omap-aes-driver
# modprobe -r omap-sham
but still it happens.
For now I set the CPU frequency to 300MHz when applying updates and use the hardware watchdog timer to reset the board in case it should happen while running normally, but this solution is obviously sub-optimal.
Also using U-Boot this never happens, even while intesively writing or reading the eMMC but the device tree is pretty much identical.
It would be really helpful if anyone knows what could trigger this kind of issue.
I am using the latest SDK (v06.03).
This is the Linux device tree:
/* * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ /dts-v1/; #include "am33xx.dtsi" #include "am335x-bone-common.dtsi" / { model = "TI AM335x"; compatible = "ti,am335x-bone-black", "ti,am335x-bone", "ti,am33xx"; memory@80000000 { device_type = "memory"; reg = <0x80000000 0x20000000>; /* 512 MB */ }; chosen { stdout-path = &uart0; tick-timer = &timer2; }; leds { pinctrl-names = "default"; pinctrl-0 = <&user_leds_s0>; compatible = "gpio-leds"; led2 { label = "led1"; gpios = <&gpio3 16 GPIO_ACTIVE_HIGH>; default-state = "off"; }; led3 { label = "led2"; gpios = <&gpio3 20 GPIO_ACTIVE_HIGH>; default-state = "off"; }; led4 { label = "led3"; gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>; default-state = "off"; }; led5 { label = "led4"; gpios = <&gpio3 15 GPIO_ACTIVE_HIGH>; default-state = "off"; }; }; }; &user_leds_s0 { pinctrl-single,pins = < AM33XX_IOPAD(0x994, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* (B13) mcasp0_fsx.gpio3_15 */ AM33XX_IOPAD(0x9a4, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* (C13) mcasp0_fsr.gpio3_19 */ AM33XX_IOPAD(0x998, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* (D12) mcasp0_axr0.gpio3_16 */ AM33XX_IOPAD(0x9a8, PIN_OUTPUT_PULLDOWN | MUX_MODE7) /* (D13) mcasp0_axr1.gpio3_20 */ >; }; &ldo3_reg { regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-always-on; }; &mmc1 { vmmc-supply = <&vmmcsd_fixed>; cd-inverted; }; &mmc2 { vmmc-supply = <&vmmcsd_fixed>; pinctrl-names = "default"; pinctrl-0 = <&emmc_pins>; bus-width = <8>; status = "okay"; }; &lcdc { status = "disabled"; }; &rtc { system-power-controller; }; &i2c2 { status = "disabled"; }; &baseboard_eeprom { status = "disabled"; }; &usb0 { status = "okay"; dr_mode = "host"; }; &usb1 { status = "disabled"; dr_mode = "peripheral"; }; &usb1_phy { status = "disabled"; }; &cpsw_emac0 { phy_id = <&davinci_mdio>, <1>; phy-mode = "mii"; }; &cpsw_emac1 { phy_id = <&davinci_mdio>, <0>; phy-mode = "mii"; }; &cpsw_default { pinctrl-single,pins = < /* Slave 1 */ AM33XX_IOPAD(0x910, PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxerr.mii1_rxerr */ AM33XX_IOPAD(0x914, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txen.mii1_txen */ AM33XX_IOPAD(0x918, PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxdv.mii1_rxdv */ AM33XX_IOPAD(0x91c, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd3.mii1_txd3 */ AM33XX_IOPAD(0x920, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd2.mii1_txd2 */ AM33XX_IOPAD(0x924, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd1.mii1_txd1 */ AM33XX_IOPAD(0x928, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd0.mii1_txd0 */ AM33XX_IOPAD(0x92c, PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_txclk.mii1_txclk */ AM33XX_IOPAD(0x930, PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxclk.mii1_rxclk */ AM33XX_IOPAD(0x934, PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd3.mii1_rxd3 */ AM33XX_IOPAD(0x938, PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd2.mii1_rxd2 */ AM33XX_IOPAD(0x93c, PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd1.mii1_rxd1 */ AM33XX_IOPAD(0x940, PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd0.mii1_rxd0 */ /* Slave 0 */ AM33XX_IOPAD(0x874, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_wpn.mii2_rxerr */ AM33XX_IOPAD(0x840, PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* gpmc_a0.mii2_txen */ AM33XX_IOPAD(0x844, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a1.mii2_rxdv */ AM33XX_IOPAD(0x848, PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* gpmc_a2.mii2_txd3 */ AM33XX_IOPAD(0x84c, PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* gpmc_a3.mii2_txd2 */ AM33XX_IOPAD(0x850, PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* gpmc_a4.mii2_txd1 */ AM33XX_IOPAD(0x854, PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* gpmc_a5.mii2_txd0 */ AM33XX_IOPAD(0x858, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a6.mii2_txclk */ AM33XX_IOPAD(0x85c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a7.mii2_rxclk */ AM33XX_IOPAD(0x860, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a8.mii2_rxd3 */ AM33XX_IOPAD(0x864, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a9.mii2_rxd2 */ AM33XX_IOPAD(0x868, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a10.mii2_rxd1 */ AM33XX_IOPAD(0x86c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a11.mii2_rxd0 */ >; }; &cpsw_sleep { pinctrl-single,pins = < /* Slave 1 reset value */ AM33XX_IOPAD(0x910, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x914, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x918, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x91c, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x920, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x924, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x928, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x92c, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x930, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x934, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x938, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x93c, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x940, PIN_INPUT_PULLDOWN | MUX_MODE7) /* Slave 0 reset value */ AM33XX_IOPAD(0x874, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x840, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x844, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x848, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x84c, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x850, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x854, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x858, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x85c, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x860, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x864, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x868, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x86c, PIN_INPUT_PULLDOWN | MUX_MODE7) >; }; &mac { slaves = <2>; }; &pruss_soc_bus { status = "disabled"; pruss: pruss@4a300000 { status = "disabled"; }; };
U-Boot device tree:
/* * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ /dts-v1/; #include "am33xx.dtsi" #include "am335x-bone-common.dtsi" / { model = "TI AM335x"; compatible = "ti,am335x-bone-black", "ti,am335x-bone", "ti,am33xx"; memory@80000000 { device_type = "memory"; reg = <0x80000000 0x20000000>; /* 512 MB */ }; chosen { stdout-path = &uart0; tick-timer = &timer2; }; config { u-boot,mmc-env-offset = <0x560000>; u-boot,mmc-env-offset-redundant = <0x580000>; }; leds { pinctrl-names = "default"; pinctrl-0 = <&user_leds_s0>; compatible = "gpio-leds"; led@2 { label = "bled1"; gpios = <&gpio3 16 GPIO_ACTIVE_HIGH>; default-state = "off"; /delete-property/ linux,default-trigger; }; led@3 { label = "bled2"; gpios = <&gpio3 20 GPIO_ACTIVE_HIGH>; default-state = "off"; /delete-property/ linux,default-trigger; }; led@4 { label = "bled3"; gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>; default-state = "off"; /delete-property/ linux,default-trigger; }; led@5 { label = "bled4"; gpios = <&gpio3 15 GPIO_ACTIVE_HIGH>; default-state = "off"; /delete-property/ linux,default-trigger; }; }; }; &ldo3_reg { regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; regulator-always-on; }; &mmc1 { vmmc-supply = <&vmmcsd_fixed>; cd-gpios = <&gpio0 6 GPIO_ACTIVE_HIGH>; }; &mmc2 { vmmc-supply = <&vmmcsd_fixed>; pinctrl-names = "default"; pinctrl-0 = <&emmc_pins>; bus-width = <8>; status = "okay"; }; &rtc { system-power-controller; }; &usb0 { status = "okay"; dr_mode = "host"; }; &usb1 { status = "okay"; dr_mode = "peripheral"; }; &cpsw_emac0 { phy_id = <&davinci_mdio>, <1>; phy-mode = "mii"; }; &cpsw_emac1 { phy_id = <&davinci_mdio>, <0>; phy-mode = "mii"; }; cpsw_default: &cpsw_default { pinctrl-single,pins = < /* Slave 1 */ AM33XX_IOPAD(0x910, PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxerr.mii1_rxerr */ AM33XX_IOPAD(0x914, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txen.mii1_txen */ AM33XX_IOPAD(0x918, PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxdv.mii1_rxdv */ AM33XX_IOPAD(0x91c, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd3.mii1_txd3 */ AM33XX_IOPAD(0x920, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd2.mii1_txd2 */ AM33XX_IOPAD(0x924, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd1.mii1_txd1 */ AM33XX_IOPAD(0x928, PIN_OUTPUT_PULLDOWN | MUX_MODE0) /* mii1_txd0.mii1_txd0 */ AM33XX_IOPAD(0x92c, PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_txclk.mii1_txclk */ AM33XX_IOPAD(0x930, PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxclk.mii1_rxclk */ AM33XX_IOPAD(0x934, PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd3.mii1_rxd3 */ AM33XX_IOPAD(0x938, PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd2.mii1_rxd2 */ AM33XX_IOPAD(0x93c, PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd1.mii1_rxd1 */ AM33XX_IOPAD(0x940, PIN_INPUT_PULLUP | MUX_MODE0) /* mii1_rxd0.mii1_rxd0 */ /* Slave 0 */ AM33XX_IOPAD(0x874, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_wpn.mii2_rxerr */ AM33XX_IOPAD(0x840, PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* gpmc_a0.mii2_txen */ AM33XX_IOPAD(0x844, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a1.mii2_rxdv */ AM33XX_IOPAD(0x848, PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* gpmc_a2.mii2_txd3 */ AM33XX_IOPAD(0x84c, PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* gpmc_a3.mii2_txd2 */ AM33XX_IOPAD(0x850, PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* gpmc_a4.mii2_txd1 */ AM33XX_IOPAD(0x854, PIN_OUTPUT_PULLDOWN | MUX_MODE1) /* gpmc_a5.mii2_txd0 */ AM33XX_IOPAD(0x858, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a6.mii2_txclk */ AM33XX_IOPAD(0x85c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a7.mii2_rxclk */ AM33XX_IOPAD(0x860, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a8.mii2_rxd3 */ AM33XX_IOPAD(0x864, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a9.mii2_rxd2 */ AM33XX_IOPAD(0x868, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a10.mii2_rxd1 */ AM33XX_IOPAD(0x86c, PIN_INPUT_PULLUP | MUX_MODE1) /* gpmc_a11.mii2_rxd0 */ >; }; cpsw_sleep: &cpsw_sleep { pinctrl-single,pins = < /* Slave 1 reset value */ AM33XX_IOPAD(0x910, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x914, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x918, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x91c, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x920, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x924, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x928, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x92c, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x930, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x934, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x938, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x93c, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x940, PIN_INPUT_PULLDOWN | MUX_MODE7) /* Slave 0 reset value */ AM33XX_IOPAD(0x874, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x840, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x844, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x848, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x84c, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x850, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x854, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x858, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x85c, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x860, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x864, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x868, PIN_INPUT_PULLDOWN | MUX_MODE7) AM33XX_IOPAD(0x86c, PIN_INPUT_PULLDOWN | MUX_MODE7) >; }; &mac { slaves = <2>; active_slave = <0>; pinctrl-names = "default", "sleep"; pinctrl-0 = <&cpsw_default>; pinctrl-1 = <&cpsw_sleep>; };
We are also using a 25MHz OSC and 303MHz DDR3 RAM.
If more info is necessary please tell me.
Thank you