TigerSHARC 0 24 марта, 2014 Опубликовано 24 марта, 2014 · Жалоба Работаю с платой lcdk omap-l138. использую SDK от TI. Недавно задумался: что если я захочу в конечном устройстве поменять размер SDRAM с 128 на 256 MB. Что для этого править надо? Знаю что в строке параметров загрузки ядра можно указать MEM=256MB , что-то ещё править надо? файл борды? там вроде как нет упоминания про SDRAM, там только nand... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 56 24 марта, 2014 Опубликовано 24 марта, 2014 · Жалоба что-то ещё править надо? Ничего. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 25 марта, 2014 Опубликовано 25 марта, 2014 · Жалоба Спасибо за короткий но ёмкий ответ. Сейчас столкнулся с такой проблемой, имелся у меня старый 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gormih 0 25 марта, 2014 Опубликовано 25 марта, 2014 · Жалоба Сейчас столкнулся с такой проблемой, имелся у меня старый SDK именно под мою плату на OMAP-L138. Использовался Linux 2.6.39 Теперь скачал SDK с ядром 3.3, но конфиг и файл борды используется для omapl138-lcdk от TI Я попытался выдрать файл борды из старого SDK и подсунуть новому ядру. Ничего не вышло. На этапе сборки я получил кучу ошибок. Буду рад любым рекомендациям по исправлению файла борды. Все правильно, версии не совместимы. Придется править почти всё. А в новом SDK что, нет под Вашу плату файла? TI очень любят объеденять в один файл кучу процов и плат. Под OMAP там целая директория в arch/arm - поройтесь... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 25 марта, 2014 Опубликовано 25 марта, 2014 · Жалоба Все правильно, версии не совместимы. Придется править почти всё. А в новом SDK что, нет под Вашу плату файла? TI очень любят объеденять в один файл кучу процов и плат. Под OMAP там целая директория в arch/arm - поройтесь... в новом SDK под мою плату файла нет, так как мою плату делал стороний разработчик и делал файл борды из файла для board_da850_evm.c Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gormih 0 26 марта, 2014 Опубликовано 26 марта, 2014 · Жалоба в новом SDK под мою плату файла нет, так как мою плату делал стороний разработчик и делал файл борды из файла для board_da850_evm.c Как вариант: 1) Находим любую борду под omap, которая есть в старой и новой версии SDK 2) Делаем diff 3) По примеру патча делаем патч/исправление под свою борду. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 26 марта, 2014 Опубликовано 26 марта, 2014 · Жалоба Как вариант: 1) Находим любую борду под omap, которая есть в старой и новой версии SDK 2) Делаем diff 3) По примеру патча делаем патч/исправление под свою борду. очень интересно, можно про второй пункт подробнее, никогда не слышал про diff... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 26 марта, 2014 Опубликовано 26 марта, 2014 · Жалоба очень интересно, можно про второй пункт подробнее, никогда не слышал про diff... diff Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gormih 0 26 марта, 2014 Опубликовано 26 марта, 2014 · Жалоба З.Ы.: Ядро линукс проще и удобней все таки собирать под линуксом. Особо легче, если при этом знаешь что такое ls, grep, diff, patch, modprobe и прочее :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 26 марта, 2014 Опубликовано 26 марта, 2014 · Жалоба З.Ы.: Ядро линукс проще и удобней все таки собирать под линуксом. Особо легче, если при этом знаешь что такое 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: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
gormih 0 26 марта, 2014 Опубликовано 26 марта, 2014 · Жалоба Вот толкьо 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alx2 0 27 марта, 2014 Опубликовано 27 марта, 2014 · Жалоба Сейчас удалось собрать ядро новой версии с исправленым файлом борды, то u-boot пишет : Uncompressing Linux... done, booting the kernel. Вообще-то это пишет не u-boot, а уже сам linux. Смотрите decompress_kernel() в arch/arm/boot/compressed/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 27 марта, 2014 Опубликовано 27 марта, 2014 · Жалоба Если что, то - 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() честно отрабатывает... а дальше вот дело не идёт... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Ya_Mike 0 28 марта, 2014 Опубликовано 28 марта, 2014 · Жалоба раз выводится "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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 28 марта, 2014 Опубликовано 28 марта, 2014 · Жалоба Спасибо за совет. на сайте TI вычитал что такое часто бывает при несовпадении machine ID в u-boot и ядре. думаю в этом и есть проблема. в файле борды я оставил machine id по умолчанию, так как в новом ядре нет дефайна для моей борды. Теперь надо создать дефайн, подправить файл борды и пересобрать ядро. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться