This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

am335x USB配置问题



目的:

          能够将u盘驱动起来。 

         问题:/dev/目录下没有usb相关的驱动节点出现

背景:

1、使用的是USB0,OTG模式

2、内核上也配置后打印的输出

usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb

NET: Registered protocol family 24
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
usbcore: registered new interface driver cdc_acm
cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
Initializing USB Mass Storage driver...
usbcore: registered new interface driver usb-storage
USB Mass Storage support registered.
usbcore: registered new interface driver usbserial
USB Serial support registered for generic
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial Driver core
USB Serial support registered for GSM modem (1-port)
usbcore: registered new interface driver option
option: v0.7.2:USB Driver for GSM modems
mousedev: PS/2 mouse device common for all mice

  • 你这个打印是am335x侧的吗?

    能不能把完整的过程描述下。谢谢!

  • 1、是在am335x上跑的。。

    2、将usb0的已经配置好,在内核上将usb驱动给添加了,

    内核启动后,在/dev目录下没有看到与usb相关驱动文件出现。

  • 不好意思,我有点没明白你的想法。

    您说的/dev下usb的节点,问题是,如果是u盘,那么usb的节点不是在/dev下有usb的,而是sdbx的节点。

  • 貌似没有sdbx节点。那应该修改什么。

  • 1. 请问您在内核文件做了哪些修改? 用的是哪个版本的sdk?

    2. 请问您用的是哪个口? 硬件电路设计是怎样的?

  • 1、内核基于天嵌开发板的内核。所以改动还是挺多的,加上我自己也有改动。//现在是要确定改动那些才能生成/dev下的节点文件。

    对比一下(1)电源供电正常。(2)引脚使用也是一样的。

    估计: 是某些usb配置还没有开启。导致没有/dev/下没有相关节点。

    2、使用的是usb0

  • 参考am335x貌似 usb的相关配置都配置了。。

    但是插入的U盘,/dev下没有sdax文件。求指导方法。

  • 可以贴下你的board-am335xevm.c 文件吗?看看你对usb口的配置。

  • usb上的配置主要是

    static void usb0_init(int evm_id, int profile)
    {
    setup_pin_mux(usb0_pin_mux);
    return;
    }

    static struct pinmux_config usb0_pin_mux[] = {
    {"usb0_drvvbus.usb0_drvvbus", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
    {NULL, 0},
    };

    {usb0_init, DEV_ON_BASEBOARD, PROFILE_ALL},

  • 我看到您似乎删了一些源码,我看到前面删掉的源码有个地方有问题:

    static struct omap_musb_board_data musb_board_data = {
        .interface_type = MUSB_INTERFACE_ULPI,
        /*
         * mode[0:3] = USB0PORT's mode
         * mode[4:7] = USB1PORT's mode
         * AM335X beta EVM has USB0 in OTG mode and USB1 in host mode.
         */
        .mode           = (MUSB_HOST << 4) | MUSB_OTG,
        .power      = 500,
        .instances  = 1,
    };
    您可以改为
    .mode           = (MUSB_HOST << 4) | MUSB_HOST ,

    然后看看结果如何
  • 按照你说的修改了,还是不行。

    /*
     * Code for AM335X EVM.
     *
    
    
    #ifdef CONFIG_UART_AUTO
    
    #define UART1	1
    #define D_CAN	2
    
    #define UART2 	3
    #define I2C2	4
    
    extern int uart1_auto_select(void);
    extern int uart2_auto_select(void);
    
    
    #endif  /*CONFIG_UART_AUTO*/
    
    #ifdef CONFIG_UART_AUTO_DEBUG
    #define printd(fmt, args...) printk(KERN_NOTICE "  [KERNEL_DEBUG:]  "fmt,##args)
    #else
    #define printd(fmt, args...)
    #endif  /*CONFIG_UART_AUTO_DEBUG*/
    
    /* Convert GPIO signal to GPIO pin number */
    #define GPIO_TO_PIN(bank, gpio) (32 * (bank) + (gpio))
    
    /* TLK PHY IDs */
    #define TLK110_PHY_ID		0x2000A201
    #define TLK110_PHY_MASK		0xfffffff0
    
    /* BBB PHY IDs */
    #define BBB_PHY_ID		0x7c0f1
    #define BBB_PHY_MASK		0xfffffffe
    
    /* TLK110 PHY register offsets */
    #define TLK110_COARSEGAIN_REG	0x00A3
    #define TLK110_LPFHPF_REG	0x00AC
    #define TLK110_SPAREANALOG_REG	0x00B9
    #define TLK110_VRCR_REG		0x00D0
    #define TLK110_SETFFE_REG	0x0107
    #define TLK110_FTSP_REG		0x0154
    #define TLK110_ALFATPIDL_REG	0x002A
    #define TLK110_PSCOEF21_REG	0x0096
    #define TLK110_PSCOEF3_REG	0x0097
    #define TLK110_ALFAFACTOR1_REG	0x002C
    #define TLK110_ALFAFACTOR2_REG	0x0023
    #define TLK110_CFGPS_REG	0x0095
    #define TLK110_FTSPTXGAIN_REG	0x0150
    #define TLK110_SWSCR3_REG	0x000B
    #define TLK110_SCFALLBACK_REG	0x0040
    #define TLK110_PHYRCR_REG	0x001F
    
    /* TLK110 register writes values */
    #define TLK110_COARSEGAIN_VAL	0x0000
    #define TLK110_LPFHPF_VAL	0x8000
    #define TLK110_SPANALOG_VAL	0x0000
    #define TLK110_VRCR_VAL		0x0008
    #define TLK110_SETFFE_VAL	0x0605
    #define TLK110_FTSP_VAL		0x0255
    #define TLK110_ALFATPIDL_VAL	0x7998
    #define TLK110_PSCOEF21_VAL	0x3A20
    #define TLK110_PSCOEF3_VAL	0x003F
    #define TLK110_ALFACTOR1_VAL	0xFF80
    #define TLK110_ALFACTOR2_VAL	0x021C
    #define TLK110_CFGPS_VAL	0x0000
    #define TLK110_FTSPTXGAIN_VAL	0x6A88
    #define TLK110_SWSCR3_VAL	0x0000
    #define TLK110_SCFALLBACK_VAL	0xC11D
    #define TLK110_PHYRCR_VAL	0x4000
    
    #if defined(CONFIG_TLK110_WORKAROUND) || \
    		defined(CONFIG_TLK110_WORKAROUND_MODULE)
    #define am335x_tlk110_phy_init()\
    	do {	\
    		phy_register_fixup_for_uid(TLK110_PHY_ID,\
    					TLK110_PHY_MASK,\
    					am335x_tlk110_phy_fixup);\
    	} while (0);
    #else
    #define am335x_tlk110_phy_init() do { } while (0);
    #endif
    
    #define BEAGLEBONE_LCD_AVDD_EN GPIO_TO_PIN(0, 7)
    #define BEAGLEBONE_LCD_BL GPIO_TO_PIN(1, 18)
    
    #define AM33XX_CTRL_REGADDR(reg)				\
    		AM33XX_L4_WK_IO_ADDRESS(AM33XX_SCM_BASE + (reg))
    
    /* bit 3: 0 - enable, 1 - disable for pull enable */
    #define AM33XX_PULL_DISA		(1 << 3)
    #define AM33XX_PULL_ENBL		(0 << 3)
    
    
    #define dbg_msg(fmt, ...) \
    	printk(KERN_NOTICE pr_fmt(fmt), ##__VA_ARGS__)
    
    int selected_pad;
    int pad_mux_value;
    
    static const struct display_panel disp_panel = {
    	WVGA,
    	32,
    	32,
    	COLOR_ACTIVE,
    };
    
    static const struct display_panel bone_lcd_cape_disp_panel = {
    	WVGA,
    	16,
    	16,
    	COLOR_ACTIVE,
    };
    
    /* LCD backlight platform Data */
    #define AM335X_BACKLIGHT_MAX_BRIGHTNESS        100
    #define AM335X_BACKLIGHT_DEFAULT_BRIGHTNESS    100
    #define AM335X_PWM_PERIOD_NANO_SECONDS        (5000 * 10) 
    #include "common.h"
    
    #include <linux/lis3lv02d.h>
    /* TSc controller */
    static struct tsc_data am335x_touchscreen_data  = {
    	.wires  = 4,
    	.x_max = 0x0fff,
    	.y_max = 0x0fff,
    	.x_plate_resistance = 200,
    };
    
    
    
    static struct omap2_hsmmc_info am335x_mmc[] __initdata = {
    	{
    		.mmc            = 1,
    		.caps           = MMC_CAP_4_BIT_DATA,
    		.gpio_cd        = GPIO_TO_PIN(0, 6),
    		.gpio_wp        = GPIO_TO_PIN(3, 18),
    		.ocr_mask       = MMC_VDD_32_33 | MMC_VDD_33_34, /* 3V3 */
    	},
    	{
    		.mmc            = 0,	/* will be set at runtime */
    	},
    	{
    		.mmc            = 0,	/* will be set at runtime */
    	},
    	{}      /* Terminator */
    };
    
    
    #ifdef CONFIG_OMAP_MUX
    static struct omap_board_mux board_mux[] __initdata = {
    	AM33XX_MUX(I2C0_SDA, OMAP_MUX_MODE0 | AM33XX_SLEWCTRL_SLOW |
    			AM33XX_INPUT_EN | AM33XX_PIN_OUTPUT),
    	AM33XX_MUX(I2C0_SCL, OMAP_MUX_MODE0 | AM33XX_SLEWCTRL_SLOW |
    			AM33XX_INPUT_EN | AM33XX_PIN_OUTPUT), 
    	{ .reg_offset = OMAP_MUX_TERMINATOR },
    };
    
    #else
    #define	board_mux	NULL
    #endif
    
    /* module pin mux structure */
    struct pinmux_config {
    	const char *string_name; /* signal name format */
    	int val; /* Options for the mux register value */
    };
    
    struct evm_dev_cfg {
    	void (*device_init)(int evm_id, int profile);
    
    /*
    * If the device is required on both baseboard & daughter board (ex i2c),
    * specify DEV_ON_BASEBOARD
    */
    #define DEV_ON_BASEBOARD	0
    #define DEV_ON_DGHTR_BRD	1
    	u32 device_on;
    
    	u32 profile;	/* Profiles (0-7) in which the module is present */
    };
    
    /* AM335X - CPLD Register Offsets */
    #define	CPLD_DEVICE_HDR	0x00 /* CPLD Header */
    #define	CPLD_DEVICE_ID	0x04 /* CPLD identification */
    #define	CPLD_DEVICE_REV	0x0C /* Revision of the CPLD code */
    #define	CPLD_CFG_REG	0x10 /* Configuration Register */
    
    
    static u32 am335x_evm_id;
    static struct omap_board_config_kernel am335x_evm_config[] __initdata = {
    };
    
    
    static bool daughter_brd_detected;
    
    #define GP_EVM_REV_IS_1_0		0x1
    #define GP_EVM_REV_IS_1_1A		0x2
    #define GP_EVM_REV_IS_UNKNOWN		0xFF
    static unsigned int gp_evm_revision = GP_EVM_REV_IS_1_1A;//lhh modify
    
    
    unsigned int gigabit_enable = 1;
    
    
    
    #define AM335X_EEPROM_HEADER		0xEE3355AA
    
    static struct pinmux_config tsc_pin_mux[] = {
    //	{"ain0.ain0",           OMAP_MUX_MODE0 | AM33XX_INPUT_EN},
    //	{"ain1.ain1",           OMAP_MUX_MODE0 | AM33XX_INPUT_EN},
    //	{"ain2.ain2",           OMAP_MUX_MODE0 | AM33XX_INPUT_EN},
    //	{"ain3.ain3",           OMAP_MUX_MODE0 | AM33XX_INPUT_EN},
    //	{"ain4.ain4",           OMAP_MUX_MODE0 | AM33XX_INPUT_EN},
    //	{"ain5.ain5",           OMAP_MUX_MODE0 | AM33XX_INPUT_EN},
    //	{"ain6.ain6",           OMAP_MUX_MODE0 | AM33XX_INPUT_EN},
    //	{"ain7.ain7",           OMAP_MUX_MODE0 | AM33XX_INPUT_EN},
    	{"vrefp.vrefp",         OMAP_MUX_MODE0 | AM33XX_INPUT_EN},
    	{"vrefn.vrefn",         OMAP_MUX_MODE0 | AM33XX_INPUT_EN},
    	{NULL, 0},
    };
    /* fortest  ai set by lin */
    static struct pinmux_config fortest_ai_pin_mux[] = {
    	{"ain0.ain0",           OMAP_MUX_MODE0 | AM33XX_INPUT_EN},
    	{"ain1.ain1",           OMAP_MUX_MODE0 | AM33XX_INPUT_EN},
    	{"ain2.ain2",           OMAP_MUX_MODE0 | AM33XX_INPUT_EN},
    	{"ain3.ain3",           OMAP_MUX_MODE0 | AM33XX_INPUT_EN},
    	{"ain4.ain4",           OMAP_MUX_MODE0 | AM33XX_INPUT_EN},
    	{"ain5.ain5",           OMAP_MUX_MODE0 | AM33XX_INPUT_EN},
    	{"ain6.ain6",           OMAP_MUX_MODE0 | AM33XX_INPUT_EN},
    	{"ain7.ain7",           OMAP_MUX_MODE0 | AM33XX_INPUT_EN},
    	{NULL, 0},
    };
    
    static struct pinmux_config fortest_di_pin_mux[] = {
    	{"gpmc_a2.gpio1_18",  OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    	{"gpmc_a3.gpio1_19",  OMAP_MUX_MODE7 | AM33XX_PIN_INPUT},
    	{NULL, 0},
    };
    
    
    
    /* Pin mux for nand flash module */
    static struct pinmux_config nand_pin_mux[] = {
    	{"gpmc_ad0.gpmc_ad0",	  OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    	{"gpmc_ad1.gpmc_ad1",	  OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    	{"gpmc_ad2.gpmc_ad2",	  OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    	{"gpmc_ad3.gpmc_ad3",	  OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    	{"gpmc_ad4.gpmc_ad4",	  OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    	{"gpmc_ad5.gpmc_ad5",	  OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    	{"gpmc_ad6.gpmc_ad6",	  OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    	{"gpmc_ad7.gpmc_ad7",	  OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    	{"gpmc_wait0.gpmc_wait0", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    	{"gpmc_wpn.gpmc_wpn",	  OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    	{"gpmc_csn0.gpmc_csn0",	  OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    	{"gpmc_advn_ale.gpmc_advn_ale",  OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    	{"gpmc_oen_ren.gpmc_oen_ren",	 OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    	{"gpmc_wen.gpmc_wen",     OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    	{"gpmc_ben0_cle.gpmc_ben0_cle",	 OMAP_MUX_MODE0 | AM33XX_PULL_DISA},
    	{NULL, 0},
    };
    
    /* Module pin mux for SPI fash */
    static struct pinmux_config spi0_pin_mux[] = {
    	{"spi0_sclk.spi0_sclk", OMAP_MUX_MODE0 | AM33XX_PULL_ENBL
    							| AM33XX_INPUT_EN},
    	{"spi0_d0.spi0_d0", OMAP_MUX_MODE0 | AM33XX_PULL_ENBL | AM33XX_PULL_UP
    							| AM33XX_INPUT_EN},
    	{"spi0_d1.spi0_d1", OMAP_MUX_MODE0 | AM33XX_PULL_ENBL
    							| AM33XX_INPUT_EN},
    	{"spi0_cs0.spi0_cs0", OMAP_MUX_MODE0 | AM33XX_PULL_ENBL | AM33XX_PULL_UP
    							| AM33XX_INPUT_EN},
    	{NULL, 0},
    };
    
    /* Module pin mux for SPI flash */
    static struct pinmux_config spi1_pin_mux[] = {
    	{"mcasp0_aclkx.spi1_sclk", OMAP_MUX_MODE3 | AM33XX_PULL_ENBL
    		| AM33XX_INPUT_EN},
    	{"mcasp0_fsx.spi1_d0", OMAP_MUX_MODE3 | AM33XX_PULL_ENBL
    		| AM33XX_PULL_UP | AM33XX_INPUT_EN},
    	{"mcasp0_axr0.spi1_d1", OMAP_MUX_MODE3 | AM33XX_PULL_ENBL
    		| AM33XX_INPUT_EN},
    	{"rmii1_refclk.spi1_cs0", OMAP_MUX_MODE2 | AM33XX_PULL_ENBL
    		| AM33XX_PULL_UP | AM33XX_INPUT_EN},
    	{NULL, 0},
    };
    
    /* Module pin mux for rgmii1 */
    static struct pinmux_config rgmii1_pin_mux[] = {
    	{"mii1_txen.rgmii1_tctl", OMAP_MUX_MODE2 | AM33XX_PIN_OUTPUT},
    	{"mii1_rxdv.rgmii1_rctl", OMAP_MUX_MODE2 | AM33XX_PIN_INPUT_PULLDOWN},
    	{"mii1_txd3.rgmii1_td3", OMAP_MUX_MODE2 | AM33XX_PIN_OUTPUT},
    	{"mii1_txd2.rgmii1_td2", OMAP_MUX_MODE2 | AM33XX_PIN_OUTPUT},
    	{"mii1_txd1.rgmii1_td1", OMAP_MUX_MODE2 | AM33XX_PIN_OUTPUT},
    	{"mii1_txd0.rgmii1_td0", OMAP_MUX_MODE2 | AM33XX_PIN_OUTPUT},
    	{"mii1_txclk.rgmii1_tclk", OMAP_MUX_MODE2 | AM33XX_PIN_OUTPUT},
    	{"mii1_rxclk.rgmii1_rclk", OMAP_MUX_MODE2 | AM33XX_PIN_INPUT_PULLDOWN},
    	{"mii1_rxd3.rgmii1_rd3", OMAP_MUX_MODE2 | AM33XX_PIN_INPUT_PULLDOWN},
    	{"mii1_rxd2.rgmii1_rd2", OMAP_MUX_MODE2 | AM33XX_PIN_INPUT_PULLDOWN},
    	{"mii1_rxd1.rgmii1_rd1", OMAP_MUX_MODE2 | AM33XX_PIN_INPUT_PULLDOWN},
    	{"mii1_rxd0.rgmii1_rd0", OMAP_MUX_MODE2 | AM33XX_PIN_INPUT_PULLDOWN},
    	{"mdio_data.mdio_data", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    	{"mdio_clk.mdio_clk", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT_PULLUP},
    	{NULL, 0},
    };
    
    /* Module pin mux for mii1 */
    static struct pinmux_config mii1_pin_mux[] = {
    	{"mii1_rxerr.mii1_rxerr", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
    	{"mii1_txen.mii1_txen", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
    	{"mii1_rxdv.mii1_rxdv", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
    	{"mii1_txd3.mii1_txd3", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
    	{"mii1_txd2.mii1_txd2", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
    	{"mii1_txd1.mii1_txd1", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
    	{"mii1_txd0.mii1_txd0", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
    	{"mii1_txclk.mii1_txclk", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
    	{"mii1_rxclk.mii1_rxclk", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
    	{"mii1_rxd3.mii1_rxd3", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
    	{"mii1_rxd2.mii1_rxd2", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
    	{"mii1_rxd1.mii1_rxd1", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
    	{"mii1_rxd0.mii1_rxd0", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLDOWN},
    	{"mdio_data.mdio_data", OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    	{"mdio_clk.mdio_clk", OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT_PULLUP},
    	{NULL, 0},
    };
    
    
    
    //fortest using
    static struct pinmux_config i2c1_pin_mux[] = {
    	{"uart0_ctsn.i2c1_sda",    OMAP_MUX_MODE3 | AM33XX_SLEWCTRL_SLOW |
    					AM33XX_PULL_ENBL | AM33XX_INPUT_EN},
    	{"uart0_rtsn.i2c1_scl",   OMAP_MUX_MODE3 | AM33XX_SLEWCTRL_SLOW |
    					AM33XX_PULL_ENBL | AM33XX_INPUT_EN},
    	{NULL, 0},
    };
    
    static struct pinmux_config i2c2_pin_mux[] = {
    	{"uart1_ctsn.i2c2_sda",    OMAP_MUX_MODE3 | AM33XX_SLEWCTRL_SLOW |
    					AM33XX_PULL_ENBL | AM33XX_INPUT_EN},
    	{"uart1_rtsn.i2c2_scl",   OMAP_MUX_MODE3 | AM33XX_SLEWCTRL_SLOW |
    					AM33XX_PULL_ENBL | AM33XX_INPUT_EN},
    	{NULL, 0},
    };
    
    static struct pinmux_config i2c0_pin_mux[] = {
    	{"i2c0_sda.i2c0_sda",    OMAP_MUX_MODE0 | AM33XX_SLEWCTRL_SLOW |
    					AM33XX_PULL_ENBL | AM33XX_INPUT_EN},
    	{"i2c0_scl.i2c0_scl",   OMAP_MUX_MODE0 | AM33XX_SLEWCTRL_SLOW |
    					AM33XX_PULL_ENBL | AM33XX_INPUT_EN},
    	{NULL, 0},
    };
    
    
    /* Module pin mux for mmc0 */
    static struct pinmux_config mmc0_pin_mux[] = {
    	{"mmc0_dat3.mmc0_dat3",	OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    	{"mmc0_dat2.mmc0_dat2",	OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    	{"mmc0_dat1.mmc0_dat1",	OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    	{"mmc0_dat0.mmc0_dat0",	OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    	{"mmc0_clk.mmc0_clk",	OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    	{"mmc0_cmd.mmc0_cmd",	OMAP_MUX_MODE0 | AM33XX_PIN_INPUT_PULLUP},
    	{"mcasp0_aclkx.mmc0_sdcd",  OMAP_MUX_MODE7 | AM33XX_PIN_INPUT_PULLUP},  //lin modify 
    	{NULL, 0},
    };
    
    /* Module pin mux for uart2 */
    static struct pinmux_config uart2_pin_mux[] = {
    	{"spi0_sclk.uart2_rxd", OMAP_MUX_MODE1 | AM33XX_SLEWCTRL_SLOW |
    						AM33XX_PIN_INPUT_PULLUP},
    	{"spi0_d0.uart2_txd", OMAP_MUX_MODE1 | AM33XX_PULL_UP |
    						AM33XX_PULL_DISA |
    						AM33XX_SLEWCTRL_SLOW},
    	{NULL, 0},
    };
    
    static struct pinmux_config uart3_pin_mux[] = {
    	{"spi0_cs1.uart3_rxd", OMAP_MUX_MODE1 | AM33XX_SLEWCTRL_SLOW |
    						AM33XX_PIN_INPUT_PULLUP},
    	{"ecap0_in_pwm0_out.uart3_txd", OMAP_MUX_MODE1 | AM33XX_PULL_UP |
    						AM33XX_PULL_DISA |
    						AM33XX_SLEWCTRL_SLOW},
    	{NULL, 0},
    };
    /* Module pin mux for uart1 */
    static struct pinmux_config uart1_pin_mux[] = {
    	{"uart1_rxd.uart1_rxd", OMAP_MUX_MODE0 | AM33XX_SLEWCTRL_SLOW |
    						AM33XX_PIN_INPUT_PULLUP},
    	{"uart1_txd.uart1_txd", OMAP_MUX_MODE0 | AM33XX_PULL_UP |
    						AM33XX_PULL_DISA |
    						AM33XX_SLEWCTRL_SLOW},
    	{NULL, 0},
    };
    
    
    /*
    * @pin_mux - single module pin-mux structure which defines pin-mux
    *			details for all its pins.
    */
    static void setup_pin_mux(struct pinmux_config *pin_mux)
    {
    	int i;
    
    	for (i = 0; pin_mux->string_name != NULL; pin_mux++)
    		omap_mux_init_signal(pin_mux->string_name, pin_mux->val);
    
    }
    
    /*
    * @evm_id - evm id which needs to be configured
    * @dev_cfg - single evm structure which includes
    *				all module inits, pin-mux defines
    * @profile - if present, else PROFILE_NONE
    * @dghtr_brd_flg - Whether Daughter board is present or not
    */
    static void _configure_device(int evm_id, struct evm_dev_cfg *dev_cfg,
    	int profile)
    {
    	int i;
    
    	/*
    	* Only General Purpose & Industrial Auto Motro Control
    	* EVM has profiles. So check if this evm has profile.
    	* If not, ignore the profile comparison
    	*/
    
    	/*
    	* If the device is on baseboard, directly configure it. Else (device on
    	* Daughter board), check if the daughter card is detected.
    	*/
    	if (profile == PROFILE_NONE) {
    		for (i = 0; dev_cfg->device_init != NULL; dev_cfg++) {
    			if (dev_cfg->device_on == DEV_ON_BASEBOARD)
    				dev_cfg->device_init(evm_id, profile);
    			else if (daughter_brd_detected == true)
    				dev_cfg->device_init(evm_id, profile);
    		}
    	} else {
    		for (i = 0; dev_cfg->device_init != NULL; dev_cfg++) {
    			if (dev_cfg->profile & profile) {
    				if (dev_cfg->device_on == DEV_ON_BASEBOARD)
    					dev_cfg->device_init(evm_id, profile);
    				else if (daughter_brd_detected == true)
    					dev_cfg->device_init(evm_id, profile);
    			}
    		}
    	}
    }
    
    
    /* pinmux for usb0 drvvbus */
    static struct pinmux_config usb0_pin_mux[] = {
    	{"usb0_drvvbus.usb0_drvvbus",    OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
    	{NULL, 0},
    };
    
    /* pinmux for usb1 drvvbus */
     static struct pinmux_config usb1_pin_mux[] = {
    	 {"usb1_drvvbus.usb1_drvvbus",    OMAP_MUX_MODE0 | AM33XX_PIN_OUTPUT},
    	 {NULL, 0},
    };
    
    // static int backlight_enable;
    #if 0 
    #define AM335XEVM_WLAN_PMENA_GPIO	GPIO_TO_PIN(1, 30)
    #define AM335XEVM_WLAN_IRQ_GPIO		GPIO_TO_PIN(3, 17)
    
    struct wl12xx_platform_data am335xevm_wlan_data = {
    	.irq = OMAP_GPIO_IRQ(AM335XEVM_WLAN_IRQ_GPIO),
    	.board_ref_clock = WL12XX_REFCLOCK_38_XTAL, /* 38.4Mhz */
    };
    #endif
    
    
    // static struct pwmss_platform_data  pwm_pdata[3] = {
    	// {
    		// .version = PWM_VERSION_1,
    	// },
    	// {
    		// .version = PWM_VERSION_1,
    	// },
    	// {
    		// .version = PWM_VERSION_1,
    	// },
    // };
    
    // //platform_device_register(s3c_device_i2c5);
    // static struct i2c_gpio_platform_data i2c5_platdata = {
            // .sda_pin                = GPIO_TO_PIN(0,12),
            // .scl_pin                = GPIO_TO_PIN(0,13),
            // .udelay                 = 5,//2--400K
            // .sda_is_open_drain      = 0,
            // .scl_is_open_drain      = 0,
            // .scl_is_output_only     = 0.
    // };
    // struct platform_device   s3c_device_i2c5 = {
            // .name                   = "i2c-gpio",
            // .id                     = 5,
            // .dev.platform_data      = &i2c5_platdata,
    // };
    
    
    // static int __init conf_disp_pll(int rate)
    // {
    	// struct clk *disp_pll;
    	// int ret = -EINVAL;
    
    	// disp_pll = clk_get(NULL, "dpll_disp_ck");
    	// if (IS_ERR(disp_pll)) {
    		// pr_err("Cannot clk_get disp_pll\n");
    		// goto out;
    	// }
    
    	// ret = clk_set_rate(disp_pll, rate);
    	// clk_put(disp_pll);
    // out:
    	// return ret;
    // }
    
    #if 0 
    static void tsc_init(int evm_id, int profile)
    {
    	int err;
    	gp_evm_revision = GP_EVM_REV_IS_1_1A;
    	if (gp_evm_revision == GP_EVM_REV_IS_1_1A) {
    		am335x_touchscreen_data.analog_input = 1;
    		pr_info("TSC connected to beta GP EVM\n");
    	} else {
    		am335x_touchscreen_data.analog_input = 0;
    		pr_info("TSC connected to alpha GP EVM\n");
    	}
    	setup_pin_mux(tsc_pin_mux);
    
    	err = am33xx_register_tsc(&am335x_touchscreen_data);
    	if (err)
    		pr_err("failed to register touchscreen device\n");
    }
    #endif 
    /*fortest ai port mux pin lin add*/
    
    static void fortest_ai_di_init(int evm_id, int profile)
    {
    	setup_pin_mux(fortest_ai_pin_mux);
    	setup_pin_mux(fortest_di_pin_mux);
    }
    
    static struct pinmux_config gpio_led_pin_mux[] = {
    	{"gpmc_a8.gpio1_24", OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT},  //fortest DO port  lin add 
    	{"gpmc_a9.gpio1_25", OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT},
    	{"gpmc_a10.gpio1_26", OMAP_MUX_MODE7 | AM33XX_PIN_OUTPUT},
    	{NULL, 0},
     };
    static void gpio_led_init(int evm_id, int profile)
    {
    	setup_pin_mux(gpio_led_pin_mux);
    }
    
    static void rgmii1_init(int evm_id, int profile)
    {
    	setup_pin_mux(rgmii1_pin_mux);  //初始化为RGMII1	
    	return;
    }
    
    static void mii1_init(int evm_id, int profile)
    {
    	setup_pin_mux(mii1_pin_mux);  //初始化为MII1
    	return;
    }
    
    static void usb0_init(int evm_id, int profile)
    {
    	setup_pin_mux(usb0_pin_mux);
    	return;
    }
    
    static void usb1_init(int evm_id, int profile)
    {
    	 setup_pin_mux(usb1_pin_mux);
    	 return;
    }
    
    
    
    /* setup uart2 */
    static void uart2_init(int evm_id, int profile)
    {
    #ifdef CONFIG_UART_AUTO
    	int ret;
    	ret = uart2_auto_select();
    	
    	printd("ret=%d  \n", ret);
    	
    	if (ret != UART2)
    	{
    		printd("don't init uart2 driver \n");
    		return;
    	}
    	printd("init uart2 driver \n");
    
    #endif /*CONFIG_UART_AUTO*/
    	setup_pin_mux(uart2_pin_mux);
    	return;
    }
    
    /* setup uart1 */
    static void uart1_init(int evm_id, int profile)
    {
    #if 0 
    // #ifdef CONFIG_UART_AUTO
    	 int ret;
    	 ret = uart1_auto_select();
    	
    	 printd("ret=%d  \n", ret);
    	
    	if (ret != UART1)
    	 {
    		 printd("don't init uart1 driver \n");
    		return;
    	 }
    	printd("init uart1 driver \n");
    // #endif /*CONFIG_UART_AUTO*/
    #endif 
    	setup_pin_mux(uart1_pin_mux);
    	return;
    }
    
    static void uart3_init(int evm_id, int profile)
    {
    
    	setup_pin_mux(uart3_pin_mux);
    	return;
    }
    
    
    /* setup haptics */
    #define HAPTICS_MAX_FREQ 250
    // static void haptics_init(int evm_id, int profile)
    // {
    	// setup_pin_mux(haptics_pin_mux);
    	// pwm_pdata[2].chan_attrib[1].max_freq = HAPTICS_MAX_FREQ;
    	// am33xx_register_ehrpwm(2, &pwm_pdata[2]);
    // }
    
    /* NAND partition information */
    static struct mtd_partition am335x_nand_partitions[] = {
    /* All the partition sizes are listed in terms of NAND block size */
    	{
    		.name           = "SPL",
    		.offset         = 0,			/* Offset = 0x0 */
    		.size           = SZ_128K,
    	},
    	{
    		.name           = "SPL.backup1",
    		.offset         = MTDPART_OFS_APPEND,	/* Offset = 0x20000 */
    		.size           = SZ_128K,
    	},
    	{
    		.name           = "SPL.backup2",
    		.offset         = MTDPART_OFS_APPEND,	/* Offset = 0x40000 */
    		.size           = SZ_128K,
    	},
    	{
    		.name           = "SPL.backup3",
    		.offset         = MTDPART_OFS_APPEND,	/* Offset = 0x60000 */
    		.size           = SZ_128K,
    	},
    	{
    		.name           = "U-Boot",
    		.offset         = MTDPART_OFS_APPEND,   /* Offset = 0x80000 */
    		.size           = 15 * SZ_128K,
    	},
    	{
    		.name           = "U-Boot Env",
    		.offset         = MTDPART_OFS_APPEND,   /* Offset = 0x260000 */
    		.size           = 1 * SZ_128K,
    	},
    	{
    		.name           = "LOGO",
    		.offset         = MTDPART_OFS_APPEND,   /* Offset = 0x280000 */
    		.size           = 3 * SZ_1M,
    	},
    	{
    		.name           = "Kernel",
    		.offset         = MTDPART_OFS_APPEND,   /* Offset = 0x580000 */
    		.size           = 5 * SZ_1M,
    	},
    	{
    		.name           = "File System",
    		.offset         = MTDPART_OFS_APPEND,   /* Offset = 0xa80000 */
    		.size           = MTDPART_SIZ_FULL,
    	},
    };
    
    /* SPI 0/1 Platform Data */
    /* SPI flash information */
    static struct mtd_partition am335x_spi_partitions[] = {
    	/* All the partition sizes are listed in terms of erase size */
    	{
    		.name       = "SPL",
    		.offset     = 0,			/* Offset = 0x0 */
    		.size       = SZ_128K,
    	},
    	{
    		.name       = "U-Boot",
    		.offset     = MTDPART_OFS_APPEND,	/* Offset = 0x20000 */
    		.size       = 2 * SZ_128K,
    	},
    	{
    		.name       = "U-Boot Env",
    		.offset     = MTDPART_OFS_APPEND,	/* Offset = 0x60000 */
    		.size       = 2 * SZ_4K,
    	},
    	{
    		.name       = "Kernel",
    		.offset     = MTDPART_OFS_APPEND,	/* Offset = 0x62000 */
    		.size       = 28 * SZ_128K,
    	},
    	{
    		.name       = "File System",
    		.offset     = MTDPART_OFS_APPEND,	/* Offset = 0x3E2000 */
    		.size       = MTDPART_SIZ_FULL,		/* size ~= 4.1 MiB */
    	}
    };
    
    static const struct flash_platform_data am335x_spi_flash = {
    	.type      = "w25q64",
    	.name      = "spi_flash",
    	.parts     = am335x_spi_partitions,
    	.nr_parts  = ARRAY_SIZE(am335x_spi_partitions),
    };
    
    static struct platform_device Acceleration_sensor = {
    	.name           = "Acceleration_sensor",
    	.id             = -1,
    };
    /*
     * SPI Flash works at 80Mhz however SPI Controller works at 48MHz.
     * So setup Max speed to be less than that of Controller speed
     */
    static struct spi_board_info am335x_spi0_slave_info[] = {
    	{
    		.modalias      = "smb380",
    		.platform_data = &Acceleration_sensor,
    		.irq           = -1,
    		.max_speed_hz  = 24000000,
    		.bus_num       = 1,
    		.chip_select   = 0,
    	},
    };
    
    
    static struct spi_board_info am335x_spi1_slave_info[] = {
    	{
    		.modalias      = "smb380",
    		.platform_data = &Acceleration_sensor,
    		.irq           = -1,
    		.mode		   =SPI_MODE_0,
    		.max_speed_hz  = 120000,
    		.bus_num       = 2,
    		.chip_select   = 0,
    	},
    };
    
    
    static struct gpmc_timings am335x_nand_timings = {
    	.sync_clk = 0,
    
    	.cs_on = 0,
    	.cs_rd_off = 44,
    	.cs_wr_off = 44,
    
    	.adv_on = 6,
    	.adv_rd_off = 34,
    	.adv_wr_off = 44,
    	.we_off = 40,
    	.oe_off = 54,
    
    	.access = 64,
    	.rd_cycle = 82,
    	.wr_cycle = 82,
    
    	.wr_access = 40,
    	.wr_data_mux_bus = 0,
    };
    
    extern void tq335x_nand_config(struct omap_nand_platform_data *pdata);
    
    static void evm_nand_init(int evm_id, int profile)
    {
    	struct omap_nand_platform_data *pdata;
    	struct gpmc_devices_info gpmc_device[2] = {
    		{ NULL, 0 },
    		{ NULL, 0 },
    	};
    
    	setup_pin_mux(nand_pin_mux);
    	pdata = omap_nand_init(am335x_nand_partitions,
    		ARRAY_SIZE(am335x_nand_partitions), 0, 0,
    		&am335x_nand_timings);
    	if (!pdata)
    		return;
    	pdata->ecc_opt =NAND_ECC_SOFT ; // OMAP_ECC_BCH8_CODE_HW;
    	tq335x_nand_config(pdata);
    	pdata->elm_used = true;
    	gpmc_device[0].pdata = pdata;
    	gpmc_device[0].flag = GPMC_DEVICE_NAND;
    
    	omap_init_gpmc(gpmc_device, sizeof(gpmc_device));
    	omap_init_elm();
    }
    
        // {
    		// I2C_BOARD_INFO("pcf8563", 0x51),//lin add
    	// },
    
    static struct i2c_board_info am335x_i2c1[] = {
    	{
    		I2C_BOARD_INFO("fortest_wsd", 0x10), //0x40
    	},
    };
    
    static struct i2c_board_info am335x_i2c2[] = {
    	{
    		I2C_BOARD_INFO("lin_test", 0x48), //0x40
    	},
    };
    
    static struct tps65910_board am335x_tps65910_info;
    static struct i2c_board_info am335x_i2c0[] = {
        {
    		I2C_BOARD_INFO("pcf8563", 0x51),
    	},
    	{
    		I2C_BOARD_INFO("tps65910", TPS65910_I2C_ID1),
    		.platform_data  = &am335x_tps65910_info,
    	},
    	{
    		I2C_BOARD_INFO("tlv320aic3x", 0x18/*0x1b*/),
    	},
    	{
    		I2C_BOARD_INFO("wm8960", 0x1a/*0x1a*/),
    	},
    };
    static void i2c0_init(int evm_id, int profile)
    {
    	setup_pin_mux(i2c0_pin_mux);
    	omap_register_i2c_bus(1, 100, am335x_i2c0,
    			ARRAY_SIZE(am335x_i2c0));
    	return;
    }
    static void i2c1_init(int evm_id, int profile)
    {
    	setup_pin_mux(i2c1_pin_mux);
    	omap_register_i2c_bus(2, 100, am335x_i2c1,
    			ARRAY_SIZE(am335x_i2c1));
    	return;
    }
    
    static void i2c2_init(int evm_id, int profile)
    {
    	setup_pin_mux(i2c2_pin_mux);
    	omap_register_i2c_bus(3, 100, am335x_i2c2,
    			ARRAY_SIZE(am335x_i2c1));
    	return;
    }
    // #if 1
    // static struct i2c_board_info am335x_i2c_boardinfo2[] = {
    	// {
    		// I2C_BOARD_INFO("fortest_wsd", 0x41),
    	// },
    // };
    
    // static void i2c2_init(int evm_id, int profile)
    // {
    	// setup_pin_mux(i2c2_pin_mux);
    	// omap_register_i2c_bus(3, 100, am335x_i2c_boardinfo2,
    			// ARRAY_SIZE(am335x_i2c_boardinfo2));
    	// return;
    // }
    // #endif 
    
    // /* Setup McASP 1 */
    // static void mcasp1_init(int evm_id, int profile)
    // {
    	// /* Configure McASP */
    	// setup_pin_mux(mcasp1_pin_mux);
    	// am335x_register_mcasp(&am335x_evm_snd_data1, 1);
    	// return;
    // }
    #if 0 
    #ifdef CONFIG_TI_ST
    /* TI-ST for WL12xx BT */
    
    /* Bluetooth Enable PAD for EVM Rev 1.1 and up */
    #define AM33XX_CONTROL_PADCONF_MCASP0_AHCLKX_OFFSET		0x09AC
    
    /* Bluetooth Enable PAD for EVM Rev 1.0 */
    #define AM33XX_CONTROL_PADCONF_GPMC_CSN2_OFFSET			0x0884
    
    int plat_kim_suspend(struct platform_device *pdev, pm_message_t state)
    {
    	/* TODO: wait for HCI-LL sleep */
    	return 0;
    }
    
    int plat_kim_resume(struct platform_device *pdev)
    {
    	return 0;
    }
    
    int plat_kim_chip_enable(struct kim_data_s *kim_data)
    {
    	printk(KERN_DEBUG "%s\n", __func__);
    
    	/* Configure BT_EN pin so that suspend/resume works correctly on rev 1.1 */
    	selected_pad = AM33XX_CONTROL_PADCONF_MCASP0_AHCLKX_OFFSET;
    	/* Configure BT_EN pin so that suspend/resume works correctly on rev 1.0 */
    	/*selected_pad = AM33XX_CONTROL_PADCONF_GPMC_CSN2_OFFSET;*/
    
    	gpio_direction_output(kim_data->nshutdown, 0);
    	msleep(1);
    	gpio_direction_output(kim_data->nshutdown, 1);
    
    	/* Enable pullup on the enable pin for keeping BT active during suspend */
    	pad_mux_value = readl(AM33XX_CTRL_REGADDR(selected_pad));
    	pad_mux_value &= (~AM33XX_PULL_DISA);
    	writel(pad_mux_value, AM33XX_CTRL_REGADDR(selected_pad));
    
    	return 0;
    }
    
    int plat_kim_chip_disable(struct kim_data_s *kim_data)
    {
    	printk(KERN_DEBUG "%s\n", __func__);
    
    	gpio_direction_output(kim_data->nshutdown, 0);
    
    	/* Disable pullup on the enable pin to allow BT shut down during suspend */
    	pad_mux_value = readl(AM33XX_CTRL_REGADDR(selected_pad));
    	pad_mux_value |= AM33XX_PULL_DISA;
    	writel(pad_mux_value, AM33XX_CTRL_REGADDR(selected_pad));
    
    	return 0;
    }
    
    struct ti_st_plat_data wilink_pdata = {
    	.nshutdown_gpio = GPIO_TO_PIN(3, 21),
    	.dev_name = "/dev/ttyO1",
    	.flow_cntrl = 1,
    	.baud_rate = 3000000,
    	.suspend = plat_kim_suspend,
    	.resume = plat_kim_resume,
    	.chip_enable = plat_kim_chip_enable,
    	.chip_disable = plat_kim_chip_disable,
    };
    
    static struct platform_device wl12xx_device = {
    	.name		= "kim",
    	.id		= -1,
    	.dev.platform_data = &wilink_pdata,
    };
    
    static struct platform_device btwilink_device = {
    	.name = "btwilink",
    	.id = -1,	
    };
    
    static inline void __init am335xevm_init_btwilink(void)
    {
    	pr_info("am335xevm: bt init\n");
    
    	platform_device_register(&wl12xx_device);
    	platform_device_register(&btwilink_device);
    }
    #endif
    #endif 
    
    static void mmc0_init(int evm_id, int profile)
    {
    	setup_pin_mux(mmc0_pin_mux);
    
    	omap2_hsmmc_init(am335x_mmc);
    	return;
    }
    
    
    
    
    /* setup spi0 */
    static void spi0_init(int evm_id, int profile)
    {
    	setup_pin_mux(spi0_pin_mux);
    	spi_register_board_info(am335x_spi0_slave_info,
    			ARRAY_SIZE(am335x_spi0_slave_info));
    	return;
    }
    
    /* setup spi1 */
    static void spi1_init(int evm_id, int profile)
    {
    	setup_pin_mux(spi1_pin_mux);
    	spi_register_board_info(am335x_spi1_slave_info,
    			ARRAY_SIZE(am335x_spi1_slave_info));
    	return;
    }
    
    static struct evm_dev_cfg embedsky_evm_dev_cfg[] = {
    //	{enable_ehrpwm1A,DEV_ON_BASEBOARD, PROFILE_0 },
    	// {enable_ecap2,DEV_ON_BASEBOARD, PROFILE_0},
    //	{lcdc_init,	DEV_ON_BASEBOARD, PROFILE_0},
    //	{tsc_init,	DEV_ON_BASEBOARD, PROFILE_0},
    	{fortest_ai_di_init,DEV_ON_BASEBOARD, PROFILE_0},   // lin modify
    	{i2c0_init,	DEV_ON_BASEBOARD, PROFILE_0},
    	{i2c1_init, DEV_ON_BASEBOARD, PROFILE_0},
    	{i2c2_init,	DEV_ON_BASEBOARD, PROFILE_0},  //PROFILE_ALL
    //#ifdef CONFIG_RTL8211
    //	{rgmii1_init,	DEV_ON_BASEBOARD, PROFILE_ALL},//网卡端口初始化
    //#else
    	{mii1_init,	DEV_ON_BASEBOARD, PROFILE_ALL},//网卡端口初始化
    //#endif
    	{usb0_init,	DEV_ON_BASEBOARD, PROFILE_ALL},
    	{usb1_init,	DEV_ON_BASEBOARD, PROFILE_ALL},
    	{evm_nand_init, DEV_ON_BASEBOARD,PROFILE_ALL},
    //	{mcasp1_init,	DEV_ON_BASEBOARD, PROFILE_0},//sound
    	{mmc0_init,	DEV_ON_BASEBOARD, (PROFILE_ALL)},
    //	{spi0_init,	DEV_ON_BASEBOARD, PROFILE_2},
    //	{spi1_init, DEV_ON_BASEBOARD, PROFILE_0},
    	{gpio_led_init,  DEV_ON_BASEBOARD, PROFILE_0},// fortest led state for lin add
    	{uart1_init,	DEV_ON_BASEBOARD, PROFILE_0},
    	{uart3_init,	DEV_ON_BASEBOARD, PROFILE_0},
    	{NULL, 0, 0},
    };
    
    extern void tq335x_config(void);
    
    static void am335x_setup_embedsky_board(struct memory_accessor *m, void *c)
    {
    
    	_configure_device(EMBEDSKY_EVM, embedsky_evm_dev_cfg, PROFILE_NONE);
    	/* Initialize cpsw after board detection is completed as board
    	 * information is required for configuring phy address and hence
    	 * should be call only after board detection
    	 */
    	tq335x_config();
    	
    }
    
    
    
    
    static struct regulator_init_data am335x_dummy = {
    	.constraints.always_on	= true,
    };
    
    static struct regulator_consumer_supply am335x_vdd1_supply[] = {
    	REGULATOR_SUPPLY("vdd_mpu", NULL),
    };
    
    static struct regulator_init_data am335x_vdd1 = {
    	.constraints = {
    		.min_uV			= 600000,
    		.max_uV			= 1500000,
    		.valid_modes_mask	= REGULATOR_MODE_NORMAL,
    		.valid_ops_mask		= REGULATOR_CHANGE_VOLTAGE,
    		.always_on		= 1,
    	},
    	.num_consumer_supplies	= ARRAY_SIZE(am335x_vdd1_supply),
    	.consumer_supplies	= am335x_vdd1_supply,
    };
    
    static struct regulator_consumer_supply am335x_vdd2_supply[] = {
    	REGULATOR_SUPPLY("vdd_core", NULL),
    };
    
    static struct regulator_init_data am335x_vdd2 = {
    	.constraints = {
    		.min_uV			= 600000,
    		.max_uV			= 1500000,
    		.valid_modes_mask	= REGULATOR_MODE_NORMAL,
    		.valid_ops_mask		= REGULATOR_CHANGE_VOLTAGE,
    		.always_on		= 1,
    	},
    	.num_consumer_supplies	= ARRAY_SIZE(am335x_vdd2_supply),
    	.consumer_supplies	= am335x_vdd2_supply,
    };
    
    static struct tps65910_board am335x_tps65910_info = {
    	.tps65910_pmic_init_data[TPS65910_REG_VRTC]	= &am335x_dummy,
    	.tps65910_pmic_init_data[TPS65910_REG_VIO]	= &am335x_dummy,
    	.tps65910_pmic_init_data[TPS65910_REG_VDD1]	= &am335x_vdd1,
    	.tps65910_pmic_init_data[TPS65910_REG_VDD2]	= &am335x_vdd2,
    	.tps65910_pmic_init_data[TPS65910_REG_VDD3]	= &am335x_dummy,
    	.tps65910_pmic_init_data[TPS65910_REG_VDIG1]	= &am335x_dummy,
    	.tps65910_pmic_init_data[TPS65910_REG_VDIG2]	= &am335x_dummy,
    	.tps65910_pmic_init_data[TPS65910_REG_VPLL]	= &am335x_dummy,
    	.tps65910_pmic_init_data[TPS65910_REG_VDAC]	= &am335x_dummy,
    	.tps65910_pmic_init_data[TPS65910_REG_VAUX1]	= &am335x_dummy,
    	.tps65910_pmic_init_data[TPS65910_REG_VAUX2]	= &am335x_dummy,
    	.tps65910_pmic_init_data[TPS65910_REG_VAUX33]	= &am335x_dummy,
    	.tps65910_pmic_init_data[TPS65910_REG_VMMC]	= &am335x_dummy,
    };
    
    
    static struct omap_musb_board_data musb_board_data = {
    	.interface_type	= MUSB_INTERFACE_ULPI,
    	/*
    	 * mode[0:3] = USB0PORT's mode
    	 * mode[4:7] = USB1PORT's mode
    	 * AM335X beta EVM has USB0 in OTG mode and USB1 in host mode.
    	 */
    	.mode           = (MUSB_HOST << 4) | MUSB_HOST ,  //MUSB_OTG
    	.power		= 500,
    	.instances	= 1,
    };
    
    
    static struct resource am335x_rtc_resources[] = {
    	{
    		.start		= AM33XX_RTC_BASE,
    		.end		= AM33XX_RTC_BASE + SZ_4K - 1,
    		.flags		= IORESOURCE_MEM,
    	},
    	{ /* timer irq */
    		.start		= AM33XX_IRQ_RTC_TIMER,
    		.end		= AM33XX_IRQ_RTC_TIMER,
    		.flags		= IORESOURCE_IRQ,
    	},
    	{ /* alarm irq */
    		.start		= AM33XX_IRQ_RTC_ALARM,
    		.end		= AM33XX_IRQ_RTC_ALARM,
    		.flags		= IORESOURCE_IRQ,
    	},
    };
    
    static struct platform_device am335x_rtc_device = {
    	.name           = "omap_rtc",
    	.id             = -1,
    	.num_resources	= ARRAY_SIZE(am335x_rtc_resources),
    	.resource	= am335x_rtc_resources,
    };
    
    static int am335x_rtc_init(void)
    {
    	void __iomem *base;
    	struct clk *clk;
    
    	clk = clk_get(NULL, "rtc_fck");
    	if (IS_ERR(clk)) {
    		pr_err("rtc : Failed to get RTC clock\n");
    		return -1;
    	}
    
    	if (clk_enable(clk)) {
    		pr_err("rtc: Clock Enable Failed\n");
    		return -1;
    	}
    
    	base = ioremap(AM33XX_RTC_BASE, SZ_4K);
    
    	if (WARN_ON(!base))
    		return -ENOMEM;
    
    	/* Unlock the rtc's registers */
    	writel(0x83e70b13, base + 0x6c);
    	writel(0x95a4f1e0, base + 0x70);
    
    	/*
    	 * Enable the 32K OSc
    	 * TODO: Need a better way to handle this
    	 * Since we want the clock to be running before mmc init
    	 * we need to do it before the rtc probe happens
    	 */
    	writel(0x48, base + 0x54);
    
    	iounmap(base);
    
    	return  platform_device_register(&am335x_rtc_device);
    }
    
    /* Enable clkout2 */
    static struct pinmux_config clkout2_pin_mux[] = {
    	{"xdma_event_intr1.clkout2", OMAP_MUX_MODE3 | AM33XX_PIN_OUTPUT},
    	{NULL, 0},
    };
    
    static void __init clkout2_enable(void)
    {
    	struct clk *ck_32;
    
    	ck_32 = clk_get(NULL, "clkout2_ck");
    	if (IS_ERR(ck_32)) {
    		pr_err("Cannot clk_get ck_32\n");
    		return;
    	}
    
    	clk_enable(ck_32);
    
    	setup_pin_mux(clkout2_pin_mux);
    }
    
    void __iomem *am33xx_emif_base;
    
    void __iomem * __init am33xx_get_mem_ctlr(void)
    {
    
    	am33xx_emif_base = ioremap(AM33XX_EMIF0_BASE, SZ_32K);
    
    	if (!am33xx_emif_base)
    		pr_warning("%s: Unable to map DDR2 controller",	__func__);
    
    	return am33xx_emif_base;
    }
    
    void __iomem *am33xx_get_ram_base(void)
    {
    	return am33xx_emif_base;
    }
    
    static struct resource am33xx_cpuidle_resources[] = {
    	{
    		.start		= AM33XX_EMIF0_BASE,
    		.end		= AM33XX_EMIF0_BASE + SZ_32K - 1,
    		.flags		= IORESOURCE_MEM,
    	},
    };
    
    /* AM33XX devices support DDR2 power down */
    static struct am33xx_cpuidle_config am33xx_cpuidle_pdata = {
    	.ddr2_pdown	= 1,
    };
    
    static struct platform_device am33xx_cpuidle_device = {
    	.name			= "cpuidle-am33xx",
    	.num_resources		= ARRAY_SIZE(am33xx_cpuidle_resources),
    	.resource		= am33xx_cpuidle_resources,
    	.dev = {
    		.platform_data	= &am33xx_cpuidle_pdata,
    	},
    };
    
    static void __init am33xx_cpuidle_init(void)
    {
    	int ret;
    
    	am33xx_cpuidle_pdata.emif_base = am33xx_get_mem_ctlr();
    
    	ret = platform_device_register(&am33xx_cpuidle_device);
    
    	if (ret)
    		pr_warning("AM33XX cpuidle registration failed\n");
    
    }
    
    static void __init am335x_evm_init(void)
    {
    	am33xx_cpuidle_init();
    	am33xx_mux_init(board_mux);
    	omap_serial_init();
    	am335x_rtc_init();
    	clkout2_enable();
    	am335x_evm_id = EMBEDSKY_EVM;
    
    	am335x_setup_embedsky_board(NULL,NULL);
    
    	omap_sdrc_init(NULL, NULL);
    	usb_musb_init(&musb_board_data);
    	omap_board_config = am335x_evm_config;
    	omap_board_config_size = ARRAY_SIZE(am335x_evm_config);
    	/* Create an alias for icss clock */
    	if (clk_add_alias("pruss", NULL, "pruss_uart_gclk", NULL))
    		pr_warn("failed to create an alias: icss_uart_gclk --> pruss\n");
    	/* Create an alias for gfx/sgx clock */
    	if (clk_add_alias("sgx_ck", NULL, "gfx_fclk", NULL))
    		pr_warn("failed to create an alias: gfx_fclk --> sgx_ck\n");
    
    }
    
    static void __init am335x_evm_map_io(void)
    {
    	omap2_set_globals_am33xx();
    	omapam33xx_map_common_io();
    }
    
    MACHINE_START(AM335XEVM, "am3358")
    	/* Maintainer: Texas Instruments */
    	.atag_offset	= 0x100,
    	.map_io		= am335x_evm_map_io,
    	.init_early	= am33xx_init_early,
    	.init_irq	= ti81xx_init_irq,
    	.handle_irq     = omap3_intc_handle_irq,
    	.timer		= &omap3_am33xx_timer,
    	.init_machine	= am335x_evm_init,
    MACHINE_END
    
    MACHINE_START(AM335XIAEVM, "am335xiaevm")
    	/* Maintainer: Texas Instruments */
    	.atag_offset	= 0x100,
    	.map_io		= am335x_evm_map_io,
    	.init_irq	= ti81xx_init_irq,
    	.init_early	= am33xx_init_early,
    	.timer		= &omap3_am33xx_timer,
    	.init_machine	= am335x_evm_init,
    MACHINE_END
    
  • 你看看id脚是不是拉地了,另外,看看vbus是否正常5v供电了。

  • 对于内核配置,不知道是否按照下面的文档做了正确的配置:

    http://processors.wiki.ti.com/index.php/UsbConfigHostMSC

  • 1、usbid 已经接地

    2、vbus 测试过是5V供电。

  •  根据网页上的配置也没有问题了。

    发现/sys文件夹里面没有关于usb的任何文件。。这个是自动生成的吗?还是怎样?

  • 确认一点,在你的硬件电路上面,R254这个0欧电阻焊了吗?如果焊了,去掉试试。

    这个电阻焊上去了后,会把VBUS和VCC的5V连在一起,这样VBUS就不是受到drvbus的信号控制了。vbus直连5V输入的时候,需要一个patch才能正常工作。

  • 1、你说的patch是?

    2、/sys目录下的usb目录和proc/bus下usb目录都是内核自动生成,还是怎样的。

  • 这是针对usb0_vbus被直接连接到了5V电源输入上的设计,做出的一个解决方案。如果没有的话,在一些客户那边遇到过无法正常识别的问题。

    可以参考这里:http://e2e.ti.com/support/arm/sitara_arm/f/791/p/333490/1163908

    不过,根据你上面提供的电路,建议你直接把R254去掉,然后进行尝试,这个就和我们的标准设计是一样了。

  • 貌似去掉R254后,能够在/sys/bus/下和/proc/bus下面找到usb目录。

    但是在/dev/下没有u盘相关的设备节点。。目前是已经插入u盘的了。

  • 这种情况下,能否在插入、拔出U盘的时候,用dmesg打印一下两段的log,然后传上来。

  • 现在拔插U盘没有任何反应,dmesg打印的是开机启动信息而已。

  • 我前面提到的改驱动的地方改了吗?

  •  从内核打印信息上看,usb驱动的信息已经配置完了。

    节点和热拔插没有实现。

  • 您用的文件系统是什么?可以把ti发布的挂上去看看

  • 我使用tq开发板文件系统。目前还没有尝试挂ti发布的ubi文件系统。

  • 经过前面的修改有新现象出现了。 

    1、使用lsusb 会打印下面信息

    Bus 001 Device 001: ID 1d6b:0002

    2、在/dev/目录下出现usbdev1.1设备文件。

    问题1:现在的问题是这usb口是通了吗?

    问题2:u盘为什么没有被挂载?

  • 您敲下命令mount看看

  • 谢谢TI朋友的指导。问题已经解决了?

    1、将R254去掉vbus就会不能正常供电了。

           我用万用表测试到的电压为0V

    2、配置usb之前有某一个步骤忽略了。导致的错误。//重新跟了一遍

    正常配置后,便能够在系统上看到相关的文件。