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.

L138 TSC2046 kernel 3.1.10 LCDK

Other Parts Discussed in Thread: OMAP-L138, TSC2046, ADS7846, OMAPL138, DA8XX

Hello,all.I am using L138 board which modified by OMAP-L138 LCDK reference design,and added TSC2046 to drive touchscreen,the linux kernel version is 3.1.10 in the ti-sdk-omapl138-lcdk-01.00.00 package.
There isnot Initialization function in ~/ti-sdk-omapl138-lcdk-01.00.00/board-support/linux-3.1.10/arch/arm/mach-davinci/board-omapl138-hawk.c,but i found the omap_ads7846_init in arch/arm/mach-omap2 folder.
Is anyone to migrate the code,and register the SPI1 device,thanks.

  • Hi,
    Can you attach the both files.
  • Yes.I have tried to modify the code ,the functions in OMAP and Davince are different,such as omap2_mcspi_device_config,OMAP_GPIO_IRQ...I changed them and complied,spi_register_board_info didnot work,the correct log is "ads7846 spi1.0: touchscreen, irq 200
    input: ADS7846 Touchscreen as /devices/platform/dm_spi.1/spi1.0/input/input0".

    By the way ,I found the function "gpio_to_irq" that is like this:
    static inline int gpio_to_irq(unsigned gpio)
    {
    /* GPIO can never have been requested or set as input */
    WARN_ON(1);
    return -EINVAL;
    }

    board-omapl138-hawk.c
    /*
     * Hawkboard.org based on TI's OMAP-L138 Platform
     *
     * Initial code: Syed Mohammed Khasim
     * Additional code derived from: arch/arm/mach-davinci/board-da850-evm.c
     *
     * Copyright (C) 2009 Texas Instruments Incorporated - http://www.ti.com
     *
     * This file is licensed under the terms of the GNU General Public License
     * version 2. This program is licensed "as is" without any warranty of
     * any kind, whether express or implied.
     */
    #include <linux/kernel.h>
    #include <linux/init.h>
    #include <linux/console.h>
    #include <linux/gpio.h>
    #include <linux/i2c.h>
    
    #include <linux/spi/spi.h>
    #include <linux/spi/ads7846.h>
    
    #include <asm/mach-types.h>
    #include <asm/mach/arch.h>
    
    #include <mach/cp_intc.h>
    #include <mach/da8xx.h>
    #include <mach/mux.h>
    
    #include "common-board-devices.h"
    
    #define HAWKBOARD_PHY_ID		"0:07"
    #define DA850_LCD_PWR_PIN		GPIO_TO_PIN(2, 8)
    #define DA850_LCD_BL_PIN		GPIO_TO_PIN(2, 15)
    
    #ifdef  CONFIG_HAWKBOARD_LCDK
    #define DA850_HAWK_MMCSD_CD_PIN		GPIO_TO_PIN(4, 0)
    #else
    #define DA850_HAWK_MMCSD_CD_PIN		GPIO_TO_PIN(3, 12)
    #endif
    
    #define DA850_HAWK_MMCSD_WP_PIN		GPIO_TO_PIN(3, 13)
    #define DA850_HAWK_USER_LED0		GPIO_TO_PIN(6, 12)
    #define DA850_HAWK_USER_LED1		GPIO_TO_PIN(6, 13)
    #define DA850_USB1_VBUS_PIN		GPIO_TO_PIN(2, 4)
    #define DA850_USB1_OC_PIN		GPIO_TO_PIN(6, 13)
    
    #define HAWKBOARD_SATA_REFCLKPN_RATE	(100 * 1000 * 1000)
    /*---------------------------------------------------------------------------------------*/
    #if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
    	defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
    /*static struct omap2_mcspi_device_config ads7846_mcspi_config = {
    	.turbo_mode	= 0,
    	.single_channel	= 1,	// 0: slave, 1: master
    };*/
    
    
    static struct ads7846_platform_data ads7846_config = {
    	.x_max			= 0x0fff,
    	.y_max			= 0x0fff,
    	.x_plate_ohms		= 180,
    	.pressure_max		= 255,
    	.debounce_max		= 10,
    	.debounce_tol		= 3,
    	.debounce_rep		= 1,
    	.gpio_pendown		= -EINVAL,
    	.keep_vref_on		= 1,
    };
    
    static struct spi_board_info ads7846_spi_board_info __initdata = {
    	.modalias		= "ads7846",
    	.bus_num		= -EINVAL,
    	.chip_select		= 0,
    	.max_speed_hz		= 1500000,
    	.controller_data	= NULL,//&ads7846_mcspi_config,
    	.irq			= -EINVAL,
    	.platform_data		= &ads7846_config,
    };
    
    void __init omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce,
    			      struct ads7846_platform_data *board_pdata)
    {
    	struct spi_board_info *spi_bi = &ads7846_spi_board_info;
    	int err;
    
    	pr_err("omap_ads7846_init enter!!!!!!!!!!!!!!!!!!!!!!!!!");
    
    	if (board_pdata && board_pdata->get_pendown_state) {
    		err = gpio_request_one(gpio_pendown, GPIOF_IN, "TSPenDown");
    		if (err) {
    			pr_err("Couldn't obtain gpio for TSPenDown: %d\n", err);
    			return;
    		}
    		gpio_export(gpio_pendown, 0);
    
    		if (gpio_debounce)
    			gpio_set_debounce(gpio_pendown, gpio_debounce);
    	}
    
    	ads7846_config.gpio_pendown = gpio_pendown;
    
    	spi_bi->bus_num	= bus_num;
    	spi_bi->irq	= gpio_to_irq(gpio_pendown);//OMAP_GPIO_IRQ(gpio_pendown);
    
    	if (board_pdata)
    		spi_bi->platform_data = board_pdata;
    	pr_err("spi_register_board_info enter!!!!!!!!!!!!!!!!!!!!!!!!!");
    	spi_register_board_info(&ads7846_spi_board_info, 1);/**/
    }
    #else
    void __init omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce,
    			      struct ads7846_platform_data *board_pdata)
    {
    }
    #endif
    /*---------------------------------------------------------------------------------------*/
    static short omapl138_hawk_mii_pins[] __initdata = {
    	DA850_MII_TXEN, DA850_MII_TXCLK, DA850_MII_COL, DA850_MII_TXD_3,
    	DA850_MII_TXD_2, DA850_MII_TXD_1, DA850_MII_TXD_0, DA850_MII_RXER,
    	DA850_MII_CRS, DA850_MII_RXCLK, DA850_MII_RXDV, DA850_MII_RXD_3,
    	DA850_MII_RXD_2, DA850_MII_RXD_1, DA850_MII_RXD_0, DA850_MDIO_CLK,
    	DA850_MDIO_D,
    	-1
    };
    
    static __init void omapl138_hawk_config_emac(void)
    {
    	void __iomem *cfgchip3 = DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG);
    	int ret;
    	u32 val;
    	struct davinci_soc_info *soc_info = &davinci_soc_info;
    
    	val = __raw_readl(cfgchip3);
    	val &= ~BIT(8);
    	ret = davinci_cfg_reg_list(omapl138_hawk_mii_pins);
    	if (ret) {
    		pr_warning("%s: cpgmac/mii mux setup failed: %d\n",
    			__func__, ret);
    		return;
    	}
    
    	/* configure the CFGCHIP3 register for MII */
    	__raw_writel(val, cfgchip3);
    	pr_info("EMAC: MII PHY configured\n");
    
    	soc_info->emac_pdata->phy_id = HAWKBOARD_PHY_ID;
    
    	ret = da8xx_register_emac();
    	if (ret)
    		pr_warning("%s: emac registration failed: %d\n",
    			__func__, ret);
    }
    
    /*
     * The following EDMA channels/slots are not being used by drivers (for
     * example: Timer, GPIO, UART events etc) on da850/omap-l138 EVM/Hawkboard,
     * hence they are being reserved for codecs on the DSP side.
     */
    static const s16 da850_dma0_rsv_chans[][2] = {
    	/* (offset, number) */
    	{ 8,  6},
    	{24,  4},
    	{30,  2},
    	{-1, -1}
    };
    
    static const s16 da850_dma0_rsv_slots[][2] = {
    	/* (offset, number) */
    	{ 8,  6},
    	{24,  4},
    	{30, 50},
    	{-1, -1}
    };
    
    static const s16 da850_dma1_rsv_chans[][2] = {
    	/* (offset, number) */
    	{ 0, 28},
    	{30,  2},
    	{-1, -1}
    };
    
    static const s16 da850_dma1_rsv_slots[][2] = {
    	/* (offset, number) */
    	{ 0, 28},
    	{30, 90},
    	{-1, -1}
    };
    
    static struct edma_rsv_info da850_edma_cc0_rsv = {
    	.rsv_chans	= da850_dma0_rsv_chans,
    	.rsv_slots	= da850_dma0_rsv_slots,
    };
    
    static struct edma_rsv_info da850_edma_cc1_rsv = {
    	.rsv_chans	= da850_dma1_rsv_chans,
    	.rsv_slots	= da850_dma1_rsv_slots,
    };
    
    static struct edma_rsv_info *da850_edma_rsv[2] = {
    	&da850_edma_cc0_rsv,
    	&da850_edma_cc1_rsv,
    };
    
    static const short hawk_mmcsd0_pins[] = {
    	DA850_MMCSD0_DAT_0, DA850_MMCSD0_DAT_1, DA850_MMCSD0_DAT_2,
    	DA850_MMCSD0_DAT_3, DA850_MMCSD0_CLK, DA850_MMCSD0_CMD,
    	DA850_GPIO3_12, DA850_GPIO3_13,
    	-1
    };
    
    static int da850_hawk_mmc_get_ro(int index)
    {
    #ifdef CONFIG_HAWKBOARD_LCDK
    	return 0;
    #else
    	return gpio_get_value(DA850_HAWK_MMCSD_WP_PIN);
    #endif
    }
    
    static int da850_hawk_mmc_get_cd(int index)
    {
    	return !gpio_get_value(DA850_HAWK_MMCSD_CD_PIN);
    }
    
    static struct davinci_mmc_config da850_mmc_config = {
    	.get_ro		= da850_hawk_mmc_get_ro,
    	.get_cd		= da850_hawk_mmc_get_cd,
    	.wires		= 4,
    	.max_freq	= 50000000,
    	.caps		= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
    	.version	= MMC_CTLR_VERSION_2,
    };
    
    static __init void omapl138_hawk_mmc_init(void)
    {
    	int ret;
    
    	ret = davinci_cfg_reg_list(hawk_mmcsd0_pins);
    	if (ret) {
    		pr_warning("%s: MMC/SD0 mux setup failed: %d\n",
    			__func__, ret);
    		return;
    	}
    
    	ret = gpio_request_one(DA850_HAWK_MMCSD_CD_PIN,
    			GPIOF_DIR_IN, "MMC CD");
    	if (ret < 0) {
    		pr_warning("%s: can not open GPIO %d\n",
    			__func__, DA850_HAWK_MMCSD_CD_PIN);
    		return;
    	}
    
    	ret = gpio_request_one(DA850_HAWK_MMCSD_WP_PIN,
    			GPIOF_DIR_IN, "MMC WP");
    	if (ret < 0) {
    		pr_warning("%s: can not open GPIO %d\n",
    			__func__, DA850_HAWK_MMCSD_WP_PIN);
    		goto mmc_setup_wp_fail;
    	}
    
    	ret = da8xx_register_mmcsd0(&da850_mmc_config);
    	if (ret) {
    		pr_warning("%s: MMC/SD0 registration failed: %d\n",
    			__func__, ret);
    		goto mmc_setup_mmcsd_fail;
    	}
    
    	return;
    
    mmc_setup_mmcsd_fail:
    	gpio_free(DA850_HAWK_MMCSD_WP_PIN);
    mmc_setup_wp_fail:
    	gpio_free(DA850_HAWK_MMCSD_CD_PIN);
    }
    
    static irqreturn_t omapl138_hawk_usb_ocic_irq(int irq, void *dev_id);
    static da8xx_ocic_handler_t hawk_usb_ocic_handler;
    
    static const short da850_hawk_usb11_pins[] = {
    	DA850_GPIO2_4, DA850_GPIO6_13,
    	-1
    };
    
    static int hawk_usb_set_power(unsigned port, int on)
    {
    	gpio_set_value(DA850_USB1_VBUS_PIN, on);
    	return 0;
    }
    
    static int hawk_usb_get_power(unsigned port)
    {
    	return gpio_get_value(DA850_USB1_VBUS_PIN);
    }
    
    static int hawk_usb_get_oci(unsigned port)
    {
    	return !gpio_get_value(DA850_USB1_OC_PIN);
    }
    
    static int hawk_usb_ocic_notify(da8xx_ocic_handler_t handler)
    {
    	int irq         = gpio_to_irq(DA850_USB1_OC_PIN);
    	int error       = 0;
    
    	if (handler != NULL) {
    		hawk_usb_ocic_handler = handler;
    
    		error = request_irq(irq, omapl138_hawk_usb_ocic_irq,
    					IRQF_DISABLED | IRQF_TRIGGER_RISING |
    					IRQF_TRIGGER_FALLING,
    					"OHCI over-current indicator", NULL);
    		if (error)
    			pr_err("%s: could not request IRQ to watch "
    				"over-current indicator changes\n", __func__);
    	} else {
    		free_irq(irq, NULL);
    	}
    	return error;
    }
    
    static struct da8xx_ohci_root_hub omapl138_hawk_usb11_pdata = {
    	.set_power      = hawk_usb_set_power,
    	.get_power      = hawk_usb_get_power,
    	.get_oci        = hawk_usb_get_oci,
    	.ocic_notify    = hawk_usb_ocic_notify,
    	/* TPS2087 switch @ 5V */
    	.potpgt         = (3 + 1) / 2,  /* 3 ms max */
    };
    
    static irqreturn_t omapl138_hawk_usb_ocic_irq(int irq, void *dev_id)
    {
    	hawk_usb_ocic_handler(&omapl138_hawk_usb11_pdata, 1);
    	return IRQ_HANDLED;
    }
    
    static __init void omapl138_hawk_usb_init(void)
    {
    	int ret;
    	u32 cfgchip2;
    
    	ret = davinci_cfg_reg_list(da850_hawk_usb11_pins);
    	if (ret) {
    		pr_warning("%s: USB 1.1 PinMux setup failed: %d\n",
    			__func__, ret);
    		return;
    	}
    
    	/* Setup the Ref. clock frequency for the HAWK at 24 MHz. */
    
    	cfgchip2 = __raw_readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));
    	cfgchip2 &= ~CFGCHIP2_REFFREQ;
    	cfgchip2 |=  CFGCHIP2_REFFREQ_24MHZ;
    	__raw_writel(cfgchip2, DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));
    
    	ret = gpio_request_one(DA850_USB1_VBUS_PIN,
    			GPIOF_DIR_OUT, "USB1 VBUS");
    	if (ret < 0) {
    		pr_err("%s: failed to request GPIO for USB 1.1 port "
    			"power control: %d\n", __func__, ret);
    		return;
    	}
    
    	ret = gpio_request_one(DA850_USB1_OC_PIN,
    			GPIOF_DIR_IN, "USB1 OC");
    	if (ret < 0) {
    		pr_err("%s: failed to request GPIO for USB 1.1 port "
    			"over-current indicator: %d\n", __func__, ret);
    		goto usb11_setup_oc_fail;
    	}
    
    	ret = da8xx_register_usb11(&omapl138_hawk_usb11_pdata);
    	if (ret) {
    		pr_warning("%s: USB 1.1 registration failed: %d\n",
    			__func__, ret);
    		goto usb11_setup_fail;
    	}
    
    	return;
    
    usb11_setup_fail:
    	gpio_free(DA850_USB1_OC_PIN);
    usb11_setup_oc_fail:
    	gpio_free(DA850_USB1_VBUS_PIN);
    }
    
    static struct davinci_uart_config omapl138_hawk_uart_config __initdata = {
    	.enabled_uarts = 0x7,
    };
    
    #ifdef CONFIG_CPU_FREQ
    static __init int omapl138_lcdk_init_cpufreq(void)
    {
    	switch (system_rev & 0xF) {
    	case 3:
    		da850_max_speed = 456000;
    		break;
    	case 2:
    		da850_max_speed = 408000;
    		break;
    	case 1:
    		da850_max_speed = 372000;
    		break;
    	}
    
    	return da850_register_cpufreq("pll0_sysclk3");
    }
    #else
    static __init int omapl138_lcdk_init_cpufreq(void) { return 0; }
    #endif
    
    /* I2C */
    static struct i2c_board_info __initdata omapl138_hawk_i2c_devices[] = {
    	{
    		I2C_BOARD_INFO("tlv320aic3x", 0x18),
    	},
    };
    
    static struct davinci_i2c_platform_data omapl138_hawk_i2c_0_pdata = {
    	.bus_freq	= 100,	/* kHz */
    	.bus_delay	= 0,	/* usec */
    };
    
    static void omapl138_hawk_i2c_init(void)
    	{
    	int ret;
    	ret = davinci_cfg_reg_list(da850_i2c0_pins);
    	if (ret)
    		pr_warning("omapl138_hawk_init: i2c0 mux setup failed: %d\n",
    				ret);
    
    	ret = da8xx_register_i2c(0, &omapl138_hawk_i2c_0_pdata);
    	if (ret)
    		pr_warning("omapl138_hawk_init: i2c0 registration failed: %d\n",
    				ret);
    	i2c_register_board_info(1, omapl138_hawk_i2c_devices,
    			ARRAY_SIZE(omapl138_hawk_i2c_devices));
    }
    
    /* VGA */
    static const short omapl138_hawk_lcdc_pins[] = {
    	DA850_GPIO2_8, DA850_GPIO2_15,
     	-1
    };
    
    /* Backlight and power is for use with LCD expansion header only */
    static void da850_panel_power_ctrl(int val)
    {
    	/* lcd backlight */
    	gpio_set_value(DA850_LCD_BL_PIN, val);
    	/* lcd power */
    	gpio_set_value(DA850_LCD_PWR_PIN, val);
    }
    
    static int da850_lcd_hw_init(void)
    {
    	int status;
    
    	status = gpio_request(DA850_LCD_BL_PIN, "lcd bl\n");
    	if (status < 0)
    		return status;
    
    	status = gpio_request(DA850_LCD_PWR_PIN, "lcd pwr\n");
    	if (status < 0) {
    		gpio_free(DA850_LCD_BL_PIN);
    		return status;
    	}
    
    	gpio_direction_output(DA850_LCD_BL_PIN, 0);
    	gpio_direction_output(DA850_LCD_PWR_PIN, 0);
    
    	/* Switch off panel power and backlight */
    	da850_panel_power_ctrl(0);
    
    	/* Switch on panel power and backlight */
    	da850_panel_power_ctrl(1);
    
    	return 0;
    }
    
    static void omapl138_hawk_display_init(void)
    {
    	int ret;
    
    	ret = davinci_cfg_reg_list(da850_lcdcntl_pins);
    	if (ret)
    		pr_warning("omapl138_hawk_init: lcdcntl mux setup failed: %d\n",
    				ret);
    	
    	ret = davinci_cfg_reg_list(omapl138_hawk_lcdc_pins);
    	if (ret)
    		pr_warning("omapl138_hawk_init: evm specific lcd mux setup "
    				"failed: %d\n",	ret);
    
    	da850_lcd_hw_init();
    
    	ret = da8xx_register_lcdc(&vga_monitor_pdata);
    	if (ret)
    		pr_warning("omapl138_hawk_init: lcdc registration failed: %d\n",
    				ret);
    }
    
    /* Set up OMAP-L138 Hawkboard/ LCDK low-level McASP driver */
    static u8 da850_iis_serializer_direction[] = {
    	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
    	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
    	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,	INACTIVE_MODE,
    	INACTIVE_MODE,	TX_MODE,	RX_MODE,	INACTIVE_MODE,
    };
    
    static struct snd_platform_data omapl138_hawk_snd_data = {
    	.tx_dma_offset	= 0x2000,
    	.rx_dma_offset	= 0x2000,
    	.op_mode	= DAVINCI_MCASP_IIS_MODE,
    	.num_serializer	= ARRAY_SIZE(da850_iis_serializer_direction),
    	.tdm_slots	= 2,
    	.serial_dir	= da850_iis_serializer_direction,
    	.asp_chan_q	= EVENTQ_0,
    	.version	= MCASP_VERSION_2,
    	.txnumevt	= 1,
    	.rxnumevt	= 1,
    };
    
    static const short omapl138_hawk_mcasp_pins[] __initconst = {
    	DA850_AHCLKX, DA850_ACLKX, DA850_AFSX,
    	DA850_AHCLKR, DA850_ACLKR, DA850_AFSR, DA850_AMUTE,
    	DA850_AXR_11, DA850_AXR_12,
    	-1
    };
    
    static void omapl138_hawk_sound_init(void)
    {
    	int ret;
    	ret = davinci_cfg_reg_list(omapl138_hawk_mcasp_pins);
    	if (ret)
    		pr_warning("omapl138_hawk_init: mcasp mux setup failed: %d\n",
    				ret);
    
    	da8xx_register_mcasp(0, &omapl138_hawk_snd_data);
    }
    
    static __init void omapl138_hawk_init(void)
    {
    	int ret;
    
    	davinci_serial_init(&omapl138_hawk_uart_config);
    	/*
    	 * shut down uart 0 and 1; they are not used on this board and
    	 * accessing them causes endless "too much work in irq53" messages
    	 * with arago fs
    	 */
    	__raw_writel(0, IO_ADDRESS(DA8XX_UART1_BASE) + 0x30);
    	__raw_writel(0, IO_ADDRESS(DA8XX_UART0_BASE) + 0x30);
    
    	omapl138_hawk_config_emac();
    
    	ret = da850_register_edma(da850_edma_rsv);
    	if (ret)
    		pr_warning("%s: EDMA registration failed: %d\n",
    			__func__, ret);
    
    	omapl138_hawk_mmc_init();
    
    	omapl138_hawk_usb_init();
    
    	ret = da8xx_register_watchdog();
    	if (ret)
    		pr_warning("omapl138_hawk_init: "
    			"watchdog registration failed: %d\n",
    			ret);
    
    	ret = da8xx_register_rtc();
    	if (ret)
    		pr_warning("omapl138_hawk_init: rtc setup failed: %d\n", ret);
    
    	ret = omapl138_lcdk_init_cpufreq();
    	if (ret)
    		pr_warning("omapl138_hawk_init: cpufreq registration failed: %d\n",
    				ret);
    
    	ret = da8xx_register_cpuidle();
    	if (ret)
    		pr_warning("omapl138_hawk_init: cpuidle registration failed: %d\n",
    				ret);
    
    	omapl138_hawk_i2c_init();
    	omapl138_hawk_display_init();
    	omapl138_hawk_sound_init();
    	omap_ads7846_init(1, DA850_TSC_PEN, 310, &ads7846_config);
    	ret = da850_register_sata(HAWKBOARD_SATA_REFCLKPN_RATE);
    	if (ret)
    		pr_warning("omapl138_lcdk_init: sata registration failed: %d\n",
    				ret);
    }
    
    #ifdef CONFIG_SERIAL_8250_CONSOLE
    static int __init omapl138_hawk_console_init(void)
    {
    	if (!machine_is_omapl138_hawkboard())
    		return 0;
    
    	return add_preferred_console("ttyS", 2, "115200");
    }
    console_initcall(omapl138_hawk_console_init);
    #endif
    
    static void __init omapl138_hawk_map_io(void)
    {
    	da850_init();
    }
    
    #ifdef CONFIG_HAWKBOARD_LCDK
    MACHINE_START(OMAPL138_HAWKBOARD, "AM18x/OMAP-L138 LCDK")
    	.boot_params	= (DA8XX_DDR_BASE + 0x100),
    	.map_io		= omapl138_hawk_map_io,
    	.init_irq	= cp_intc_init,
    	.timer		= &davinci_timer,
    	.init_machine	= omapl138_hawk_init,
    	.dma_zone_size	= SZ_128M,
    MACHINE_END
    #else
    MACHINE_START(OMAPL138_HAWKBOARD, "AM18x/OMAP-L138 Hawkboard")
    	.boot_params	= (DA8XX_DDR_BASE + 0x100),
    	.map_io		= omapl138_hawk_map_io,
    	.init_irq	= cp_intc_init,
    	.timer		= &davinci_timer,
    	.init_machine	= omapl138_hawk_init,
    	.dma_zone_size	= SZ_128M,
    MACHINE_END
    #endif
    

  • Hi,
    Do you want to add TSC2046 support in kernel ?
    Or ADS7846 ?
  • Hi,
    LCDK board doesn't have SPI flash, you won't find SPI related code.
    You can refer to the OMAPL138 SDI or EVM board files.

    Please change the following lines as per your SPI bus, CS and GPIO IRQ implementation on your custom board.

    #include <linux/spi/spi.h>
    #include <linux/spi/ads7846.h>

    /*
    * Touchscreen - TSC2046 connected to SSP2
    */

    static const struct ads7846_platform_data tsc2046_info = {
    .model = 7846,
    .vref_delay_usecs = 100,
    .pressure_max = 1024,
    .debounce_max = 10,
    .debounce_tol = 3,
    .debounce_rep = 1,
    .gpio_pendown = <Use the GPIO no here>,
    };

    static struct spi_board_info tsc2046_board_info[] __initdata = {
    {
    .modalias = "ads7846",
    .bus_num = 1,
    .max_speed_hz = 2600000, /* 100 kHz sample rate */
    .irq = gpio_to_irq(<Use the GPIO no here>),
    .platform_data = &tsc2046_info,
    .chip_select = 0,
    },
    };


    ret = da8xx_register_spi(1, tsc2046_board_info,
    ARRAY_SIZE(tsc2046_board_info));
    if (ret)
    pr_warning("da850_evm_init: spi 1 touch screen registration failed: %d\n",
    ret);
  • Thank you for your reply,As your method,there is an error "spi_davinci spi_davinci.1: SPI data transfer error",and there is not spi configuration the struct tsc2046_board_info,I add the SPI initialization function,please check attached file.

    tsc2046.log
    NAND:  512 MiB
    MMC:   davinci: 0
    Bad block table found at page 262080, version 0x01
    Bad block table found at page 262016, version 0x01
    nand_read_bbt: Bad block at 0x000000c80000
    nand_read_bbt: Bad block at 0x000000ca0000
    In:    serial
    Out:   serial
    Err:   serial
    Net:   DaVinci-EMAC
    Hit any key to stop autoboot:  0
    
    NAND read: device 0 offset 0x400000, size 0x400000
     4194304 bytes read: OK
    
    Loading from nand0, offset 0x400000
       Image Name:   Linux-3.1.10
       Image Type:   ARM Linux Kernel Image (uncompressed)
       Data Size:    1971312 Bytes = 1.9 MiB
       Load Address: c0008000
       Entry Point:  c0008000
    ## Booting kernel from Legacy Image at c0700000 ...
       Image Name:   Linux-3.1.10
       Image Type:   ARM Linux Kernel Image (uncompressed)
       Data Size:    1971312 Bytes = 1.9 MiB
       Load Address: c0008000
       Entry Point:  c0008000
       Verifying Checksum ... OK
       Loading Kernel Image ... OK
    OK
    
    Starting kernel ...
    
    Uncompressing Linux... done, booting the kernel.
    Linux version 3.1.10 (root@ubuntu.workshop.net) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-203) ) #30 PREEMPT Mon Aug 31 18:00:11 CST 2015
    CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
    CPU: VIVT data cache, VIVT instruction cache
    Machine: AM18x/OMAP-L138 LCDK
    Memory policy: ECC disabled, Data cache writeback
    DaVinci da850/omap-l138/am18x variant 0x1
    Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 30480
    Kernel command line: console=ttyS2,115200n8 rootwait rw mem=120M root=/dev/nfs rootftype=jffs2 nfsroot=192.168.1.41:/home/user/ti-sdk-omapl138-lcdk-01.00.00/filesystem ip=192.168.1.21:192.168.1.43:192.168.1.43:255.255.255.0::eth0:off notifyk.vpssm3_sva=0xBF900000 earlyprintk
    PID hash table entries: 512 (order: -1, 2048 bytes)
    Dentry cache hash table entries: 16384 (order: 4, 65536 bytes)
    Inode-cache hash table entries: 8192 (order: 3, 32768 bytes)
    Memory: 120MB = 120MB total
    Memory: 117836k/117836k available, 5044k reserved, 0K highmem
    Virtual kernel memory layout:
        vector  : 0xffff0000 - 0xffff1000   (   4 kB)
        fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
        DMA     : 0xff000000 - 0xffe00000   (  14 MB)
        vmalloc : 0xc8000000 - 0xfea00000   ( 874 MB)
        lowmem  : 0xc0000000 - 0xc7800000   ( 120 MB)
        modules : 0xbf000000 - 0xc0000000   (  16 MB)
          .text : 0xc0008000 - 0xc037c220   (3537 kB)
          .init : 0xc037d000 - 0xc03a0000   ( 140 kB)
          .data : 0xc03a0000 - 0xc03c0da0   ( 132 kB)
           .bss : 0xc03c0dc4 - 0xc03d983c   (  99 kB)
    SLUB: Genslabs=13, HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
    Preemptible hierarchical RCU implementation.
    NR_IRQS:245
    Console: colour dummy device 80x30
    Calibrating delay loop... 148.88 BogoMIPS (lpj=744448)
    pid_max: default: 32768 minimum: 301
    Mount-cache hash table entries: 512
    CPU: Testing write buffer coherency: ok
    DaVinci: 144 gpio irqs
    NET: Registered protocol family 16
    EMAC: MII PHY configured
    da850_evm_init: spi 1 registration success!: 0
    bio: create slab <bio-0> at 0
    SCSI subsystem initialized
    usbcore: registered new interface driver usbfs
    usbcore: registered new interface driver hub
    usbcore: registered new device driver usb
    Advanced Linux Sound Architecture Driver Version 1.0.24.
    Switching to clocksource timer0_1
    Switched to NOHz mode on CPU #0
    NET: Registered protocol family 2
    IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
    TCP established hash table entries: 4096 (order: 3, 32768 bytes)
    TCP bind hash table entries: 4096 (order: 2, 16384 bytes)
    TCP: Hash tables configured (established 4096 bind 4096)
    TCP reno registered
    UDP hash table entries: 256 (order: 0, 4096 bytes)
    UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
    NET: Registered protocol family 1
    RPC: Registered named UNIX socket transport module.
    RPC: Registered udp transport module.
    RPC: Registered tcp transport module.
    RPC: Registered tcp NFSv4.1 backchannel transport module.
    msgmni has been set to 230
    io scheduler noop registered (default)
    da8xx_lcdc da8xx_lcdc.0: GLCD: Found Sharp_LK043T1DG01 panel
    Serial: 8250/16550 driver, 3 ports, IRQ sharing disabled
    serial8250.0: ttyS0 at MMIO 0x1c42000 (irq = 25) is a 16550A
    serial8250.0: ttyS1 at MMIO 0x1d0c000 (irq = 53) is a 16550A
    serial8250.0: ttyS2 at MMIO 0x1d0d000 (irq = 61) is a 16550A
    console [ttyS2] enabled
    brd: module loaded
    spi_davinci spi_davinci.1: DMA: supported
    spi_davinci spi_davinci.1: DMA: RX channel: 18, TX channel: 19, event queue: 0
    spi_davinci spi_davinci.1: spi_match_master_to_boardinfo *************** ads7846
    spi_davinci spi_davinci.1: Controller at 0xfef0e000
    davinci_mdio davinci_mdio.0: davinci mdio revision 1.5
    davinci_mdio davinci_mdio.0: detected phy mask ffffff7f
    davinci_mdio.0: probed
    davinci_mdio davinci_mdio.0: phy[7]: device 0:07, driver unknown
    ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
    ohci ohci.0: DA8xx OHCI
    ohci ohci.0: new USB bus registered, assigned bus number 1
    Waiting for USB PHY clock good...
    ohci ohci.0: irq 59, io mem 0x01e25000
    usb usb1: New USB device found, idVendor=1d6b, idProduct=0001
    usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
    usb usb1: Product: DA8xx OHCI
    usb usb1: Manufacturer: Linux 3.1.10 ohci_hcd
    usb usb1: SerialNumber: ohci.0
    hub 1-0:1.0: USB hub found
    hub 1-0:1.0: 1 port detected
    ads7846 spi1.0: touchscreen, irq 205
    spi_davinci spi_davinci.1: SPI data transfer error
    input: ADS7846 Touchscreen as /devices/platform/spi_davinci.1/spi1.0/input/input0
    omap_rtc omap_rtc: rtc core: registered omap_rtc as rtc0
    omap_rtc: RTC power up reset detected
    i2c /dev entries driver
    davinci_mmc davinci_mmc.0: Using DMA, 4-bit mode
    asoc: tlv320aic3x-hifi <-> davinci-mcasp.0 mapping ok
    ALSA device list:
      #0: DA850/OMAP-L138 EVM
    TCP cubic registered
    NET: Registered protocol family 17
    davinci_emac davinci_emac.1: using random MAC addr: d6:96:21:56:6c:df
    console [netcon0] enabled
    netconsole: network logging started
    omap_rtc omap_rtc: setting system clock to 2000-01-01 00:00:00 UTC (946684800)
    davinci_mdio davinci_mdio.0: resetting idled controller
    net eth0: attached PHY driver [Generic PHY] (mii_bus:phy_addr=0:07, id=7c0f1)
    PHY: 0:07 - Link is Up - 100/Full
    IP-Config: Complete:
         device=eth0, addr=192.168.1.21, mask=255.255.255.0, gw=192.168.1.43,
         host=192.168.1.21, domain=, nis-domain=(none),
         bootserver=192.168.1.43, rootserver=192.168.1.41, rootpath=
    VFS: Mounted root (nfs filesystem) on device 0:12.
    Freeing init memory: 140K
    INIT: version 2.86 booting
    Please wait: booting...
    Starting udev
    udevd (919): /proc/919/oom_adj is deprecated, please use /proc/919/oom_score_adj instead.
    mousedev: PS/2 mouse device common for all mice
    Root filesystem already rw, not remounting
    Caching udev devnodes
    Populating dev cachemv: cannot rename '/tmp/devices': No such file or directory
    NET: Registered protocol family 10
    ALSA: Restoring mixer settings...
    NOT configuring network interfaces: / is an NFS mount
    Tue Apr 10 18:57:00 UTC 2012
    INIT: Entering runlevel: 5
    Starting system message bus: dbus.
    Starting Hardware abstraction layer hald
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5
    spi_davinci spi_davinci.1: SPI data transfer error
    ads7846 spi1.0: spi_async --> -5