Jump to content

    
Sign in to follow this  
TigerSHARC

Правка файла борды

Recommended Posts

Работаю с платой lcdk omap-l138. использую SDK от TI.

Недавно задумался: что если я захочу в конечном устройстве поменять размер SDRAM с 128 на 256 MB.

Что для этого править надо? Знаю что в строке параметров загрузки ядра можно указать MEM=256MB , что-то ещё править надо? файл борды? там вроде как нет упоминания про SDRAM, там только nand...

Share this post


Link to post
Share on other sites

Спасибо за короткий но ёмкий ответ.

 

Сейчас столкнулся с такой проблемой, имелся у меня старый SDK именно под мою плату на OMAP-L138. Использовался Linux 2.6.39

Теперь скачал SDK с ядром 3.3, но конфиг и файл борды используется для omapl138-lcdk от TI

 

Я попытался выдрать файл борды из старого SDK и подсунуть новому ядру. Ничего не вышло. На этапе сборки я получил кучу ошибок.

 

Буду рад любым рекомендациям по исправлению файла борды.

 

Вот код моего файла из старого SDK:

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/console.h>
#include <linux/i2c.h>
#include <linux/i2c/at24.h>
#include <linux/input.h>
#include <linux/mfd/tps6507x.h>
#include <linux/gpio.h>
#include <linux/platform_device.h>
#include <linux/leds.h>
#include <linux/interrupt.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/partitions.h>
#include <linux/regulator/machine.h>
#include <linux/regulator/tps6507x.h>
#include <linux/input/tps6507x-ts.h>
#include <linux/spi/spi.h>
#include <linux/spi/flash.h> 
#include <linux/delay.h>
#include <linux/i2c-gpio.h>

#include <asm/mach-types.h>
#include <asm/mach/arch.h>

#include <mach/cp_intc.h>
#include <mach/da8xx.h>
#include <mach/nand.h>
#include <mach/mux.h>
#include <mach/aemif.h>
#include <mach/spi.h> 
#include <mach/flash.h>
#include <mach/usb.h>
#include <mach/vpif.h>
#include <media/davinci/videohd.h>

#include <media/tvp514x.h>

#define OWLBOARDPLUS_PHY_ID		"0:01"
#define OWLBOARDPLUS_LCD_PWR_PIN		GPIO_TO_PIN(0, 8)

#define OWLBOARDPLUS_MMCSD_CD_PIN		GPIO_TO_PIN(2, 6)
#define OWLBOARDPLUS_MMCSD_WP_PIN		GPIO_TO_PIN(1, 15)

#define OWLBOARDPLUS_LED0			GPIO_TO_PIN(0, 4)

#define FACTORY_CONFIG_MAGIC    0x012C0138
#define FACTORY_CONFIG_VERSION  0x00010001



struct factory_config {
u32     magic;
u32     version;
u8      mac[6];
u32     fpga_type;
u32     spare;
u32     serialnumber;
char    partnum[32];
};

static struct factory_config factory_config;

static void read_factory_config(struct memory_accessor *a, void *context)
{
int ret;

ret = a->read(a, (char *)&factory_config, 0, sizeof(factory_config));
    if (ret != sizeof(struct factory_config)) {
	pr_warning("MityOMAPL138: Read Factory Config Failed: %d\n",
ret);
    return;
       }

       if (factory_config.magic != FACTORY_CONFIG_MAGIC) {
    pr_warning("MityOMAPL138: Factory Config Magic Wrong (%X)\n",
    factory_config.magic);
    return;
}
       if (factory_config.version != FACTORY_CONFIG_VERSION) {
           pr_warning("MityOMAPL138: Factory Config Version Wrong (%X)\n",
           factory_config.version);
           return;
       }       
pr_info("MityOMAPL138: Found MAC = %pM\n", factory_config.mac);
pr_info("MityOMAPL138: Part Number = %s\n", factory_config.partnum);
}


static const short owlboardplus_led_pins[] = {
       DA850_GPIO0_4,
       -1
};

static struct gpio_led owlboardplus_leds[] = {
       { .name = "green", .gpio = OWLBOARDPLUS_LED0, .active_low = false, .default_trigger = "heartbeat" },
};

static struct gpio_led_platform_data owlboardplus_leds_data = {
       .num_leds       = ARRAY_SIZE(owlboardplus_leds),
       .leds           = owlboardplus_leds,
};

static struct platform_device owlboardplus_leds_dev = {
       .name = "leds-gpio",
       .id   = -1,
       .dev = {
               .platform_data          = &owlboardplus_leds_data,
       },
};


static const short owlboardplus_evm_gpio_pins[] = {
DA850_GPIO0_4,
-1
};

static struct davinci_spi_platform_data da850evm_spi1_pdata = {        
.version	= SPI_VERSION_2,
.num_chipselect = 1,
.intr_line      = 1,
}; 

static struct mtd_partition da850evm_spiflash_part[] = {               
   [0] = {
.name = "U-Boot",
.offset = 0,
.size = SZ_512K,
.mask_flags = MTD_WRITEABLE,
   },
   [1] = {
.name = "U-Boot-Env",
.offset = MTDPART_OFS_APPEND,
.size = SZ_256K,
.mask_flags = MTD_WRITEABLE,
   },
   [2] = {
.name = "Kernel",
.offset = MTDPART_OFS_APPEND,
.size = SZ_2M + SZ_512K,
.mask_flags = 0,
   },
   [3] = {
.name = "Filesystem",
.offset = MTDPART_OFS_APPEND,
.size = MTDPART_SIZ_FULL,
.mask_flags = 0,
   },
}; 

static struct flash_platform_data da850evm_spiflash_data = {
.name		= "mx25l6405d",
.parts		= da850evm_spiflash_part,
.nr_parts	= ARRAY_SIZE(da850evm_spiflash_part),
};

static struct davinci_spi_config da850evm_spiflash_cfg = {
.io_type	= SPI_IO_TYPE_DMA,
.c2tdelay	= 8,
.t2cdelay	= 8,
};

static struct spi_board_info da850evm_spi_info[] = {
       {
.modalias		= "mx25l6405d",
.platform_data		= &da850evm_spiflash_data,
.controller_data	= &da850evm_spiflash_cfg,
.mode			= SPI_MODE_0,
.max_speed_hz		= 30000000,
.bus_num		= 1,
.chip_select		= 0,
},
};

static void __init da850evm_init_spi1(struct spi_board_info *info, unsigned len)
{
int ret;

ret = spi_register_board_info(info, len);
if (ret)
	pr_warning("failed to register board info : %d\n", ret);

ret = da8xx_register_spi(1, &da850evm_spi1_pdata);
if (ret)
	pr_warning("failed to register spi 1 device : %d\n", ret);
}






static inline void owlboardplus_init_leds(void)
{
       int ret = 0;

       ret = davinci_cfg_reg_list(owlboardplus_led_pins);
       if (ret)
              pr_warning("owlboardplus_init: led mux setup failed: "
                               "%d\n", ret);

       ret = platform_device_register(&owlboardplus_leds_dev);
}


#define TVP5147_CH0		"tvp514x-0"

#define VPIF_STATUS	(0x002C)
#define VPIF_STATUS_CLR	(0x0030)


static struct davinci_pm_config owlboardplus_pm_pdata = {
.sleepcount = 128,
};

static struct platform_device owlboardplus_pm_device = {
.name           = "pm-davinci",
.dev = {
	.platform_data	= &owlboardplus_pm_pdata,
},
.id             = -1,
};

static struct mtd_partition owlboardplus_nandflash_partition[] = {
      /* U-Boot Environment */
      [0] = {
              .name           = "uboot_env",
              .offset         = 0,
              .size           = SZ_128K,
              .mask_flags     = 0,
      },
      /* U-Boot */
      [1] = {
              .name           = "uboot",
              .offset         = MTDPART_OFS_APPEND,
              .size           = 3 * SZ_128K,
              .mask_flags     = MTD_WRITEABLE,        /* force read-only */
      },
      /* kernel */
      [2] = {
              .name           = "kernel",
              .offset         = MTDPART_OFS_APPEND,
              .size           = SZ_2M + SZ_512K,
              .mask_flags     = 0,
      },
      /* UBI */
      [3] = {
              .name           = "ubi",
              .offset         = MTDPART_OFS_APPEND,
              .size           = MTDPART_SIZ_FULL,
              .mask_flags     = 0,
      },
};

static struct davinci_aemif_timing owlboardplus_nandflash_timing = {
.wsetup		= 24,
.wstrobe	= 21,
.whold		= 14,
.rsetup		= 19,
.rstrobe	= 50,
.rhold		= 0,
.ta		= 20,
};

static struct davinci_nand_pdata owlboardplus_nandflash_data = {
.parts		= owlboardplus_nandflash_partition,
.nr_parts	= ARRAY_SIZE(owlboardplus_nandflash_partition),
.ecc_mode	= NAND_ECC_HW,
.ecc_bits	= 1,
.options	= NAND_USE_FLASH_BBT,
.timing		= &owlboardplus_nandflash_timing,
};

static struct resource owlboardplus_nandflash_resource[] = {
{
	.start	= DA8XX_AEMIF_CS3_BASE,
	.end	= DA8XX_AEMIF_CS3_BASE + SZ_512K + 2 * SZ_1K - 1,
	.flags	= IORESOURCE_MEM,
},
{
	.start	= DA8XX_AEMIF_CTL_BASE,
	.end	= DA8XX_AEMIF_CTL_BASE + SZ_32K - 1,
	.flags	= IORESOURCE_MEM,
},
};

static struct platform_device owlboardplus_nandflash_device = {
.name		= "davinci_nand",
.id		= 1,
.dev		= {
	.platform_data	= &owlboardplus_nandflash_data,
},
.num_resources	= ARRAY_SIZE(owlboardplus_nandflash_resource),
.resource	= owlboardplus_nandflash_resource,
};

static struct platform_device *owlboardplus_devices[] __initdata = {
&owlboardplus_nandflash_device,
};

static const short owlboardplus_nand_pins[] = {
DA850_EMA_D_0, DA850_EMA_D_1, DA850_EMA_D_2, DA850_EMA_D_3,
DA850_EMA_D_4, DA850_EMA_D_5, DA850_EMA_D_6, DA850_EMA_D_7,
DA850_EMA_A_1, DA850_EMA_A_2, DA850_NEMA_CS_3, DA850_NEMA_CS_4,
DA850_NEMA_WE, DA850_NEMA_OE,
-1
};



/*
* USB1 VBUS is controlled by GPIO2[4], over-current is reported on GPIO6[13].
*/
#define ON_BD_USB_DRV	GPIO_TO_PIN(2, 4)
#define ON_BD_USB_OVC	GPIO_TO_PIN(6, 13)

static const short owlboardplus_usb11_pins[] = {
DA850_GPIO2_4, DA850_GPIO6_13,
-1
};

static da8xx_ocic_handler_t owlboardplus_usb_ocic_handler;

static int owlboardplus_usb_set_power(unsigned port, int on)
{
gpio_set_value(ON_BD_USB_DRV, on);
return 0;
}

static int owlboardplus_usb_get_power(unsigned port)
{
return gpio_get_value(ON_BD_USB_DRV);
}

static int owlboardplus_usb_get_oci(unsigned port)
{
return !gpio_get_value(ON_BD_USB_OVC);
}

static irqreturn_t owlboardplus_usb_ocic_irq(int, void *);

static int owlboardplus_usb_ocic_notify(da8xx_ocic_handler_t handler)
{
int irq		= gpio_to_irq(ON_BD_USB_OVC);
int error	= 0;

if (handler != NULL) {
	owlboardplus_usb_ocic_handler = handler;

	error = request_irq(irq, owlboardplus_usb_ocic_irq, IRQF_DISABLED |
			    IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
			    "OHCI over-current indicator", NULL);
	if (error)
		printk(KERN_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 owlboardplus_usb11_pdata = {
.set_power	= owlboardplus_usb_set_power,
.get_power	= owlboardplus_usb_get_power,
.get_oci	= owlboardplus_usb_get_oci,
.ocic_notify	= owlboardplus_usb_ocic_notify,

/* TPS2065 switch @ 5V */
.potpgt		= (3 + 1) / 2,	/* 3 ms max */
};

static irqreturn_t owlboardplus_usb_ocic_irq(int irq, void *dev_id)
{
owlboardplus_usb_ocic_handler(&owlboardplus_usb11_pdata, 1);
return IRQ_HANDLED;
}

static __init void owlboardplus_usb_init(void)
{
u32 cfgchip2;
int ret;

/*
 * Set up USB clock/mode in the CFGCHIP2 register.
 * FYI:  CFGCHIP2 is 0x0000ef00 initially.
 */
cfgchip2 = __raw_readl(DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));

/* USB2.0 PHY reference clock is 24 MHz */
cfgchip2 &= ~CFGCHIP2_REFFREQ;
cfgchip2 |=  CFGCHIP2_REFFREQ_24MHZ;

/*
 * Select internal reference clock for USB 2.0 PHY
 * and use it as a clock source for USB 1.1 PHY
 * (this is the default setting anyway).
 */
cfgchip2 &= ~CFGCHIP2_USB1PHYCLKMUX;
cfgchip2 |=  CFGCHIP2_USB2PHYCLKMUX;

/*
 * We have to override VBUS/ID signals when MUSB is configured into the
 * host-only mode -- ID pin will float if no cable is connected, so the
 * controller won't be able to drive VBUS thinking that it's a B-device.
 * Otherwise, we want to use the OTG mode and enable VBUS comparators.
 */
cfgchip2 &= ~CFGCHIP2_OTGMODE;
#ifdef	CONFIG_USB_MUSB_HOST
cfgchip2 |=  CFGCHIP2_FORCE_HOST;
#else
cfgchip2 |=  CFGCHIP2_SESENDEN | CFGCHIP2_VBDTCTEN;
#endif

__raw_writel(cfgchip2, DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP2_REG));

/*
 * TPS2065 switch @ 5V supplies 1 A (sustains 1.5 A),
 * with the power on to power good time of 3 ms.
 */
ret = da8xx_register_usb20(1000, 3);
if (ret)
	pr_warning("%s: USB 2.0 registration failed: %d\n",
		   __func__, ret);

ret = davinci_cfg_reg_list(owlboardplus_usb11_pins);
if (ret) {
	pr_warning("%s: USB 1.1 PinMux setup failed: %d\n",
		   __func__, ret);
	return;
}

ret = gpio_request(ON_BD_USB_DRV, "ON_BD_USB_DRV");
if (ret) {
	printk(KERN_ERR "%s: failed to request GPIO for USB 1.1 port "
	       "power control: %d\n", __func__, ret);
	return;
}
gpio_direction_output(ON_BD_USB_DRV, 0);

ret = gpio_request(ON_BD_USB_OVC, "ON_BD_USB_OVC");
if (ret) {
	printk(KERN_ERR "%s: failed to request GPIO for USB 1.1 port "
	       "over-current indicator: %d\n", __func__, ret);
	return;
}
gpio_direction_input(ON_BD_USB_OVC);

ret = da8xx_register_usb11(&owlboardplus_usb11_pdata);
if (ret)
	pr_warning("%s: USB 1.1 registration failed: %d\n",
		   __func__, ret);
}

static struct davinci_uart_config owlboardplus_uart_config __initdata = {
.enabled_uarts = 0x7,
};


static struct snd_platform_data owlboardplus_snd_data = {
.asp_chan_q	= EVENTQ_0,
}; 






static int owlboardplus_mmc_get_ro(int index)
{
return gpio_get_value(OWLBOARDPLUS_MMCSD_WP_PIN);
}

static int owlboardplus_mmc_get_cd(int index)
{
return !gpio_get_value(OWLBOARDPLUS_MMCSD_CD_PIN);
}

static struct davinci_mmc_config owlboardplus_mmc1_config = {
.get_ro		= owlboardplus_mmc_get_ro,
.get_cd		= owlboardplus_mmc_get_cd,
.wires		= 4,
.max_freq	= 50000000,
.caps		= MMC_CAP_MMC_HIGHSPEED | MMC_CAP_SD_HIGHSPEED,
.version	= MMC_CTLR_VERSION_2,
};

static void owlboardplus_panel_power_ctrl(int val)
{
/* lcd power */
gpio_set_value(OWLBOARDPLUS_LCD_PWR_PIN, val);
}

static int owlboardplus_lcd_hw_init(void)
{
void __iomem *cfg_mstpri2_base;
int status;
u32 val;
/*
 * Reconfigure the LCDC priority to the highest to ensure that
 * the throughput/latency requirements for the LCDC are met.
 */
cfg_mstpri2_base = DA8XX_SYSCFG0_VIRT(DA8XX_MSTPRI2_REG);

val = __raw_readl(cfg_mstpri2_base);
val &= 0x0fffffff;
__raw_writel(val, cfg_mstpri2_base);

status = gpio_request(OWLBOARDPLUS_LCD_PWR_PIN, "lcd pwr\n");
if (status < 0) {
	return status;
}

gpio_direction_output(OWLBOARDPLUS_LCD_PWR_PIN, 0);

return 0;
}

/* TPS65070 voltage regulator support */

/* 3.3V */
static struct regulator_consumer_supply tps65070_dcdc1_consumers[] = {
{
	.supply = "usb0_vdda33",
},
{
	.supply = "usb1_vdda33",
},
};

/* 3.3V or 1.8V */
static struct regulator_consumer_supply tps65070_dcdc2_consumers[] = {
{
	.supply = "dvdd3318_a",
},
{
	.supply = "dvdd3318_b",
},
{
	.supply = "dvdd3318_c",
},
};

/* 1.2V */
static struct regulator_consumer_supply tps65070_dcdc3_consumers[] = {
{
	.supply = "cvdd",
},
};

/* 1.8V LDO */
static struct regulator_consumer_supply tps65070_ldo1_consumers[] = {
{
	.supply = "sata_vddr",
},
{
	.supply = "usb0_vdda18",
},
{
	.supply = "usb1_vdda18",
},
{
	.supply = "ddr_dvdd18",
},
};

/* 1.2V LDO */
static struct regulator_consumer_supply tps65070_ldo2_consumers[] = {
{
	.supply = "sata_vdd",
},
{
	.supply = "pll0_vdda",
},
{
	.supply = "pll1_vdda",
},
{
	.supply = "usbs_cvdd",
},
{
	.supply = "vddarnwa1",
},
};

/* We take advantage of the fact that both defdcdc{2,3} are tied high */
static struct tps6507x_reg_platform_data tps6507x_platform_data = {
.defdcdc_default = true,
};

static struct regulator_init_data tps65070_regulator_data[] = {
/* dcdc1 */
{
	.constraints = {
		.min_uV = 3150000,
		.max_uV = 3450000,
		.valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
			REGULATOR_CHANGE_STATUS),
		.boot_on = 1,
	},
	.num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc1_consumers),
	.consumer_supplies = tps65070_dcdc1_consumers,
},

/* dcdc2 */
{
	.constraints = {
		.min_uV = 1710000,
		.max_uV = 3450000,
		.valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
			REGULATOR_CHANGE_STATUS),
		.boot_on = 1,
	},
	.num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc2_consumers),
	.consumer_supplies = tps65070_dcdc2_consumers,
	.driver_data = &tps6507x_platform_data,
},

/* dcdc3 */
{
	.constraints = {
		.min_uV = 950000,
		.max_uV = 1350000,
		.valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
			REGULATOR_CHANGE_STATUS),
		.boot_on = 1,
	},
	.num_consumer_supplies = ARRAY_SIZE(tps65070_dcdc3_consumers),
	.consumer_supplies = tps65070_dcdc3_consumers,
	.driver_data = &tps6507x_platform_data,
},

/* ldo1 */
{
	.constraints = {
		.min_uV = 1710000,
		.max_uV = 1890000,
		.valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
			REGULATOR_CHANGE_STATUS),
		.boot_on = 1,
	},
	.num_consumer_supplies = ARRAY_SIZE(tps65070_ldo1_consumers),
	.consumer_supplies = tps65070_ldo1_consumers,
},

/* ldo2 */
{
	.constraints = {
		.min_uV = 1140000,
		.max_uV = 1320000,
		.valid_ops_mask = (REGULATOR_CHANGE_VOLTAGE |
			REGULATOR_CHANGE_STATUS),
		.boot_on = 1,
	},
	.num_consumer_supplies = ARRAY_SIZE(tps65070_ldo2_consumers),
	.consumer_supplies = tps65070_ldo2_consumers,
},
};

static struct touchscreen_init_data tps6507x_touchscreen_data = {
.poll_period =  30,	/* ms between touch samples */
.min_pressure = 0x100,	/* minimum pressure to trigger touch */
.vref = 0,		/* turn off vref when not using A/D */
.vendor = 0,		/* /sys/class/input/input?/id/vendor */
.product = 65070,	/* /sys/class/input/input?/id/product */
.version = 0x100,	/* /sys/class/input/input?/id/version */
};

static struct tps6507x_board tps_board = {
.tps6507x_pmic_init_data = &tps65070_regulator_data[0],
.tps6507x_ts_init_data = &tps6507x_touchscreen_data,
};

static struct at24_platform_data da850_evm_i2c_eeprom_info = {
.byte_len       = 256,
.page_size      = 8,
.flags          = AT24_FLAG_READONLY | AT24_FLAG_IRUGO,
.setup          = read_factory_config,
.context        = NULL,
};




static struct i2c_board_info __initdata owlboardplus_i2c_devices[] = {
{
	I2C_BOARD_INFO("tlv320aic3x", 0x18),
},
{
	I2C_BOARD_INFO("tps6507x", 0x48),
	.platform_data = &tps_board,
},
{
	I2C_BOARD_INFO("24c02", 0x50),
	.platform_data = &da850_evm_i2c_eeprom_info,
},
{	I2C_BOARD_INFO("ds1307", 0x68),
	.type        = "ds1338",
},
};

static const short owlboardplus_lcdc_pins[] = {
DA850_GPIO0_8,
-1
};


static const short owlboardplus_rmii_pins[] = {
DA850_RMII_TXD_0, DA850_RMII_TXD_1, DA850_RMII_TXEN,
DA850_RMII_CRS_DV, DA850_RMII_RXD_0, DA850_RMII_RXD_1,
DA850_RMII_RXER, DA850_RMII_MHZ_50_CLK, DA850_MDIO_CLK,
DA850_MDIO_D,
-1
};



static int __init owlboardplus_config_emac(void)
{
void __iomem *cfg_chip3_base;
int ret;
u32 val;
struct davinci_soc_info *soc_info = &davinci_soc_info;

if (!machine_is_l138_owlboard_plus())
	return 0;

cfg_chip3_base = DA8XX_SYSCFG0_VIRT(DA8XX_CFGCHIP3_REG);

val = __raw_readl(cfg_chip3_base);

	val |= BIT(8);
	ret = davinci_cfg_reg_list(owlboardplus_rmii_pins);  /* ruslan */
	pr_info("EMAC: RMII PHY configured, MII PHY will not be"
						" functional\n");
if (ret)
	pr_warning("owlboardplus_init: cpgmac/rmii mux setup failed: %d\n",
			ret);


       ret = davinci_cfg_reg(DA850_GPIO2_6);
       if (ret)
               pr_warning("owlboardplus_init:GPIO(2,6) mux setup "
                                                       "failed\n");

       ret = davinci_cfg_reg(DA850_GPIO1_15);
       if (ret)
               pr_warning("owlboardplus_init:GPIO(1,15) mux setup "
                                                       "failed\n");

/* configure the CFGCHIP3 register for RMII or MII */
__raw_writel(val, cfg_chip3_base);

soc_info->emac_pdata->phy_id = OWLBOARDPLUS_PHY_ID;

ret = da8xx_register_emac();
if (ret)
	pr_warning("owlboardplus_init: emac registration failed: %d\n",
			ret);

return 0;
}
device_initcall(owlboardplus_config_emac);

/*
* The following EDMA channels/slots are not being used by drivers (for
* example: Timer, GPIO, UART events etc) on owlboardplus/omap-l138 EVM, hence
* they are being reserved for codecs on the DSP side.
*/
static const s16 owlboardplus_dma0_rsv_chans[][2] = {
/* (offset, number) */
{ 8,  6},
{24,  4},
{30,  2},
{-1, -1}
};

static const s16 owlboardplus_dma0_rsv_slots[][2] = {
/* (offset, number) */
{ 8,  6},
{24,  4},
{30, 50},
{-1, -1}
};

static const s16 owlboardplus_dma1_rsv_chans[][2] = {
/* (offset, number) */
{ 0, 28},
{30,  2},
{-1, -1}
};

static const s16 owlboardplus_dma1_rsv_slots[][2] = {
/* (offset, number) */
{ 0, 28},
{30, 90},
{-1, -1}
};

static struct edma_rsv_info owlboardplus_edma_cc0_rsv = {
.rsv_chans	= owlboardplus_dma0_rsv_chans,
.rsv_slots	= owlboardplus_dma0_rsv_slots,
};

static struct edma_rsv_info owlboardplus_edma_cc1_rsv = {
.rsv_chans	= owlboardplus_dma1_rsv_chans,
.rsv_slots	= owlboardplus_dma1_rsv_slots,
};

static struct edma_rsv_info *owlboardplus_edma_rsv[2] = {
&owlboardplus_edma_cc0_rsv,
&owlboardplus_edma_cc1_rsv,
};

#ifdef CONFIG_CPU_FREQ
static __init int owlboardplus_init_cpufreq(void)
{
da850_max_speed = 456000;

return da850_register_cpufreq("pll0_sysclk3");
}
#else
static __init int owlboardplus_init_cpufreq(void) { return 0; }
#endif

static struct i2c_gpio_platform_data owlboardplus_gpio_i2c_pdata = {             /* ruslan */
.sda_pin	= GPIO_TO_PIN(1, 4),
.scl_pin	= GPIO_TO_PIN(1, 5),
.udelay		= 2,			/* 250 KHz */
}; 

static struct platform_device owlboardplus_gpio_i2c = {                         /* ruslan */
.name		= "i2c-gpio",
.id		= 1,
.dev		= {
.platform_data	= &owlboardplus_gpio_i2c_pdata,
},
}; 




// static struct davinci_i2c_platform_data da850_evm_i2c_0_pdata = {       /* ruslan */
//	.bus_freq       = 100,  /* kHz */
//	.bus_delay      = 0,    /* usec */
//};

static int owlboardplus_setup_vpif_input_channel_mode(int mux_mode)
{
return 0;
}

/*Enable TVP5147
*/
int owlboardplus_vpif_setup_input_path(int ch, const char *name)
{
return 0;
}

static int owlboardplus_vpif_intr_status(void __iomem *vpif_base, int channel)
{
int status = 0;
int mask;

if (channel < 0 || channel > 3)
	return 0;

mask = 1 << channel;
status = __raw_readl((vpif_base + VPIF_STATUS)) & mask;
__raw_writel(status, (vpif_base + VPIF_STATUS_CLR));

return status;
}


/* VPIF capture configuration */
static struct tvp514x_platform_data tvp5146_pdata = {
.clk_polarity = 0,
.hs_polarity = 1,
.vs_polarity = 1
};


#define TVP514X_STD_ALL (V4L2_STD_NTSC | V4L2_STD_PAL)

static struct vpif_subdev_info owlboardplus_vpif_capture_sdev_info[] = {
{
	.name		=  TVP5147_CH0,  
	.board_info = {
		I2C_BOARD_INFO("tvp5146", 0x5d),
		.platform_data = &tvp5146_pdata,
	},
	.input = INPUT_CVBS_VI4A,    /* V4A */
	.output = OUTPUT_10BIT_422_EMBEDDED_SYNC, 
	.can_route = 1,
	.vpif_if = {
		.if_type = VPIF_IF_BT656,
		.hd_pol = 1,
		.vd_pol = 1,
		.fid_pol = 0,
	},
},
};

static const struct vpif_input owlboardplus_ch0_inputs[] = {
{
	.input = {
		.index = 0,
		.name = "Composite",
		.type = V4L2_INPUT_TYPE_CAMERA,
		.std =  TVP514X_STD_ALL,
	},
	.subdev_name = TVP5147_CH0,   
},
};

static struct vpif_capture_config owlboardplus_vpif_capture_config = {
.setup_input_channel_mode = owlboardplus_setup_vpif_input_channel_mode,
.setup_input_path = owlboardplus_vpif_setup_input_path,
.intr_status = owlboardplus_vpif_intr_status,
.subdev_info = owlboardplus_vpif_capture_sdev_info,
.subdev_count = ARRAY_SIZE(owlboardplus_vpif_capture_sdev_info),

.chan_config[0] = {
},
.chan_config[1] = {
.inputs = owlboardplus_ch0_inputs,
.input_count = ARRAY_SIZE(owlboardplus_ch0_inputs),
},
.card_name      = "DA850/OMAP-L138 Video Capture",
};


#if defined(CONFIG_TI_DAVINCI_EMAC) || \
defined(CONFIG_TI_DAVINCI_EMAC_MODULE)
#define HAS_EMAC 1
#else
#define HAS_EMAC 0
#endif

#if defined(CONFIG_SND_DA850_SOC_EVM) || \
defined(CONFIG_SND_DA850_SOC_EVM_MODULE)
#define HAS_MCASP 1
#else
#define HAS_MCASP 0
#endif

#define CONFIG_DA850_UI_RMII

#if defined(CONFIG_DA850_UI_RMII) && (HAS_EMAC)
#define HAS_RMII 1
#else
#define HAS_RMII 0
#endif

#if defined(CONFIG_VIDEO_DAVINCI_VPIF_CAPTURE) ||\
	defined(CONFIG_VIDEO_DAVINCI_VPIF_CAPTURE_MODULE)
#define HAS_VPIF_CAPTURE 1
#else
#define HAS_VPIF_CAPTURE 0
#endif

#define DA850EVM_SATA_REFCLKPN_RATE	(100 * 1000 * 1000)

extern const short da850_mmcsd1_pins[];

static __init void owlboardplus_init(void)
{
int ret;
struct davinci_soc_info *soc_info = &davinci_soc_info;
soc_info->emac_pdata->rmii_en = 1;

ret = da850_register_edma(owlboardplus_edma_rsv);
if (ret)
	pr_warning("owlboardplus_init: edma registration failed: %d\n",
			ret);

ret = davinci_cfg_reg_list(da850_i2c0_pins);
if (ret)
	pr_warning("owlboardplus_init: i2c0 mux setup failed: %d\n",
			ret);

platform_device_register(&owlboardplus_gpio_i2c);                      /* ruslan */

//	ret = da8xx_register_i2c(0, &da850_evm_i2c_0_pdata);                           
//	    if (ret)
//	    pr_warning("da850_evm_init: i2c0 registration failed: %d\n",
//		ret);

ret = da8xx_register_watchdog();
if (ret)
	pr_warning("da830_evm_init: watchdog registration failed: %d\n",
			ret);

ret = da850_register_sata(DA850EVM_SATA_REFCLKPN_RATE);
if (ret)
	pr_warning("owlboardplus_init: sata registration failed: %d\n",
			ret);

ret = gpio_request(OWLBOARDPLUS_MMCSD_CD_PIN, "MMC CD\n");
if (ret)
	pr_warning("owlboardplus_init: can not open GPIO %d\n",
			OWLBOARDPLUS_MMCSD_CD_PIN);
gpio_direction_input(OWLBOARDPLUS_MMCSD_CD_PIN);

ret = gpio_request(OWLBOARDPLUS_MMCSD_WP_PIN, "MMC WP\n");
if (ret)
	pr_warning("owlboardplus_init: can not open GPIO %d\n",
			OWLBOARDPLUS_MMCSD_WP_PIN);
gpio_direction_input(OWLBOARDPLUS_MMCSD_WP_PIN);

ret = davinci_cfg_reg_list(da850_mmcsd1_pins);
if (ret)
	pr_warning("owlboardplus_init: mmcsd0 mux setup failed:"
			" %d\n", ret);

ret = da850_register_mmcsd1(&owlboardplus_mmc1_config);
if (ret)
	pr_warning("owlboardplus_init: mmcsd0 registration failed:"
			" %d\n", ret);

davinci_serial_init(&owlboardplus_uart_config);


ret = davinci_cfg_reg_list(owlboardplus_nand_pins);
if (ret)
	pr_warning("owlboardplus_init: nand mux setup failed: "
			"%d\n", ret);

platform_add_devices(owlboardplus_devices,
		ARRAY_SIZE(owlboardplus_devices));


i2c_register_board_info(1, owlboardplus_i2c_devices,
		ARRAY_SIZE(owlboardplus_i2c_devices));
/*
 * shut down uart 0 and 1; they are not used on the board and
 * accessing them causes endless "too much work in irq53" messages
 * with arago fs
 */
__raw_writel(0, IO_ADDRESS(DA8XX_UART0_BASE) + 0x30);
__raw_writel(0, IO_ADDRESS(DA8XX_UART1_BASE) + 0x30);

if (1/*HAS_MCBSP1*/) {
	pr_warning("mcbsp1 "
		" %d\n", ret);

	ret = davinci_cfg_reg_list(da850_mcbsp1_pins);
	if (ret)    			pr_warning("da850_evm_init: mcbsp1 mux setup failed:"
		" %d\n", ret);

	ret = da850_init_mcbsp1(&owlboardplus_snd_data);
	if (ret)
	pr_warning("da850_evm_init: mcbsp1 registration"
	" failed: %d\n", ret);
} 

#if 0

if (HAS_MCASP) {
	ret = davinci_cfg_reg_list(da850_mcasp_pins);
	if (ret)
		pr_warning("owlboardplus_init: mcasp mux setup failed:"
				"%d\n", ret);

	da8xx_register_mcasp(0, &owlboardplus_snd_data);
}
#endif

ret = davinci_cfg_reg_list(da850_lcdcntl_pins);
if (ret)
	pr_warning("owlboardplus_init: lcdcntl mux setup failed: %d\n",
			ret);
ret = owlboardplus_lcd_hw_init();
if (ret)
	pr_warning("owlboardplus_init: lcd initialization failed: %d\n",
			ret);

sharp_lk043t1dg01_pdata.panel_power_ctrl = owlboardplus_panel_power_ctrl,
	ret = da8xx_register_lcdc(&dt_atm0700d4_pdata);
if (ret)
	pr_warning("owlboardplus_init: lcdc registration failed: %d\n",
			ret);

ret = da8xx_register_rtc();
if (ret)
	pr_warning("owlboardplus_init: rtc setup failed: %d\n", ret);

ret = owlboardplus_init_cpufreq();
if (ret)
	pr_warning("owlboardplus_init: cpufreq registration failed: %d\n",
			ret);

ret = da8xx_register_cpuidle();
if (ret)
	pr_warning("owlboardplus_init: cpuidle registration failed: %d\n",
			ret);

ret = da850_register_pm(&owlboardplus_pm_device);
if (ret)
	pr_warning("owlboardplus_init: suspend registration failed: %d\n",
			ret);

da850evm_init_spi1(da850evm_spi_info, ARRAY_SIZE(da850evm_spi_info));

ret = da850_register_vpif();
if (ret)
	pr_warning("owlboardplus_init: VPIF registration failed: "
				"%d\n",	ret);

ret = davinci_cfg_reg_list(da850_vpif_capture_pins);
if (ret)
	pr_warning("owlboardplus_init: vpif capture mux failed: "
				"%d\n",	ret);

ret = da850_register_vpif_capture(&owlboardplus_vpif_capture_config);
if (ret)
	pr_warning("owlboardplus_init: VPIF registration failed: "
				"%d\n",	ret);

ret = davinci_cfg_reg(DA850_ECAP2_APWM2);
if (ret)
	pr_warning("owlboardplus_init:ecap mux failed: %d\n", ret);

ret = da850_register_ecap(2);
if (ret)
	pr_warning("owlboardplus_init: eCAP registration failed: %d\n",
			ret);

/* initilaize usb module */
owlboardplus_usb_init();
owlboardplus_init_leds();

}

#ifdef CONFIG_SERIAL_8250_CONSOLE
static int __init owlboardplus_console_init(void)
{
if (!machine_is_l138_owlboard_plus())
	return 0;

return add_preferred_console("ttyS", 2, "115200");
}
console_initcall(owlboardplus_console_init);
#endif

static void __init owlboardplus_map_io(void)
{
da850_init();
}

MACHINE_START(L138_OWLBOARD_PLUS, "Owlboard Plus OMAP-L138/AM1808")
.boot_params	= (DA8XX_DDR_BASE + 0x100),
.map_io		= owlboardplus_map_io,
.init_irq	= cp_intc_init,
.timer		= &davinci_timer,
.init_machine	= owlboardplus_init,
MACHINE_END

 

оригинальный файл из ядра 3.3, который надо переделать http://lxr.free-electrons.com/source/arch/...c.h?v=3.3;a=arm

 

Share this post


Link to post
Share on other sites
Сейчас столкнулся с такой проблемой, имелся у меня старый SDK именно под мою плату на OMAP-L138. Использовался Linux 2.6.39

Теперь скачал SDK с ядром 3.3, но конфиг и файл борды используется для omapl138-lcdk от TI

 

Я попытался выдрать файл борды из старого SDK и подсунуть новому ядру. Ничего не вышло. На этапе сборки я получил кучу ошибок.

 

Буду рад любым рекомендациям по исправлению файла борды.

Все правильно, версии не совместимы.

Придется править почти всё.

А в новом SDK что, нет под Вашу плату файла? TI очень любят объеденять в один файл кучу процов и плат. Под OMAP там целая директория в arch/arm - поройтесь...

Share this post


Link to post
Share on other sites
Все правильно, версии не совместимы.

Придется править почти всё.

А в новом SDK что, нет под Вашу плату файла? TI очень любят объеденять в один файл кучу процов и плат. Под OMAP там целая директория в arch/arm - поройтесь...

в новом SDK под мою плату файла нет, так как мою плату делал стороний разработчик и делал файл борды из файла для board_da850_evm.c

 

Share this post


Link to post
Share on other sites
в новом SDK под мою плату файла нет, так как мою плату делал стороний разработчик и делал файл борды из файла для board_da850_evm.c

Как вариант:

1) Находим любую борду под omap, которая есть в старой и новой версии SDK

2) Делаем diff

3) По примеру патча делаем патч/исправление под свою борду.

Share this post


Link to post
Share on other sites
Как вариант:

1) Находим любую борду под omap, которая есть в старой и новой версии SDK

2) Делаем diff

3) По примеру патча делаем патч/исправление под свою борду.

очень интересно, можно про второй пункт подробнее, никогда не слышал про diff...

Share this post


Link to post
Share on other sites

З.Ы.: Ядро линукс проще и удобней все таки собирать под линуксом. Особо легче, если при этом знаешь что такое ls, grep, diff, patch, modprobe и прочее :-)

Share this post


Link to post
Share on other sites
З.Ы.: Ядро линукс проще и удобней все таки собирать под линуксом. Особо легче, если при этом знаешь что такое ls, grep, diff, patch, modprobe и прочее :-)

так и делаю. из всего перечисленого не применял только diff и grep

Ну вот не довелось...

Вот толкьо diff тут не совсем мне подходит. так как файлы борды бывают разбитыми на несколкьо фйлов (для моей платы по умолчанию конфигурация борды задаётся в dboard_da850_evm.c и в board_da850_sdi.c)

 

Сейчас удалось собрать ядро новой версии с исправленым файлом борды, то u-boot пишет :

 

Uncompressing Linux... done, booting the kernel.

 

и тишина.....

 

:smile3046:

Share this post


Link to post
Share on other sites
Вот толкьо diff тут не совсем мне подходит. так как файлы борды бывают разбитыми на несколкьо фйлов (для моей платы по умолчанию конфигурация борды задаётся в dboard_da850_evm.c и в board_da850_sdi.c)

Если что, то -

 

diff -u ./kernel-3.14.1/ ./kernel-2.6.36/ >kernel-from-2636-to-3141.patch

 

Сделает патч на все ядро целиком. Это для справки.

Аналогичный патч можно сделать например на всю директорию arch/arm/plat-omap и sound/soc/omap - именно там основные отличия в части исходников интересных по Вашей теме.

 

 

Сейчас удалось собрать ядро новой версии с исправленым файлом борды, то u-boot пишет :

 

Uncompressing Linux... done, booting the kernel.

 

и тишина.....

 

Конфигурацию u-boot не меняли?

Такое бывает еще, когда например в u-boot не задана ttys, а в ядре по умолчанию не прописана, либо прописана но не правильно.

И на всякий случай дайте вывод

file ./uImage

Share this post


Link to post
Share on other sites
Сейчас удалось собрать ядро новой версии с исправленым файлом борды, то u-boot пишет :

 

Uncompressing Linux... done, booting the kernel.

Вообще-то это пишет не u-boot, а уже сам linux. Смотрите decompress_kernel() в arch/arm/boot/compressed/

Share this post


Link to post
Share on other sites
Если что, то -

 

diff -u ./kernel-3.14.1/ ./kernel-2.6.36/ >kernel-from-2636-to-3141.patch

 

Сделает патч на все ядро целиком. Это для справки.

Аналогичный патч можно сделать например на всю директорию arch/arm/plat-omap и sound/soc/omap - именно там основные отличия в части исходников интересных по Вашей теме.

 

 

 

 

Конфигурацию u-boot не меняли?

Такое бывает еще, когда например в u-boot не задана ttys, а в ядре по умолчанию не прописана, либо прописана но не правильно.

И на всякий случай дайте вывод

file ./uImage

file ./uImage выдаёт информацию которая прописывалась после команды mkimage. тут всё нормально.

изначально в строке запуска было прописано console=ttyS2,115200

пробовал console=/dev/ttyO2, 115200

результат одинаковый

 

Вообще-то это пишет не u-boot, а уже сам linux. Смотрите decompress_kernel() в arch/arm/boot/compressed/

 

а что его смотреть?

раз выводится "done, booting the kernel." - значит decompress_kernel() честно отрабатывает... а дальше вот дело не идёт...

 

Share this post


Link to post
Share on other sites
раз выводится "done, booting the kernel." - значит decompress_kernel() честно отрабатывает... а дальше вот дело не идёт...

 

А опцию "early printk" и "kernel low level debugging functions" пробовали включать? Возможно, с этими опциями вы получите ответ, почему не загружается плата.

 

Kernel hacking -> Early printk

Kernel hacking -> Kernel debugging -> Kernel low-level debugging

 

См. FAQ от TI.

Share this post


Link to post
Share on other sites

Спасибо за совет.

 

на сайте TI вычитал что такое часто бывает при несовпадении machine ID в u-boot и ядре.

думаю в этом и есть проблема.

 

в файле борды я оставил machine id по умолчанию, так как в новом ядре нет дефайна для моей борды. Теперь надо создать дефайн, подправить файл борды и пересобрать ядро.

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this