|
@@ -251,3 +251,185 @@ static struct platform_device isi_ov2640 = {
|
|
|
* LCD Controller
|
|
|
*/
|
|
|
#if defined(CONFIG_FB_ATMEL) || defined(CONFIG_FB_ATMEL_MODULE)
|
|
|
+static struct fb_videomode at91_tft_vga_modes[] = {
|
|
|
+ {
|
|
|
+ .name = "LG",
|
|
|
+ .refresh = 60,
|
|
|
+ .xres = 480, .yres = 272,
|
|
|
+ .pixclock = KHZ2PICOS(9000),
|
|
|
+
|
|
|
+ .left_margin = 1, .right_margin = 1,
|
|
|
+ .upper_margin = 40, .lower_margin = 1,
|
|
|
+ .hsync_len = 45, .vsync_len = 1,
|
|
|
+
|
|
|
+ .sync = 0,
|
|
|
+ .vmode = FB_VMODE_NONINTERLACED,
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct fb_monspecs at91fb_default_monspecs = {
|
|
|
+ .manufacturer = "LG",
|
|
|
+ .monitor = "LB043WQ1",
|
|
|
+
|
|
|
+ .modedb = at91_tft_vga_modes,
|
|
|
+ .modedb_len = ARRAY_SIZE(at91_tft_vga_modes),
|
|
|
+ .hfmin = 15000,
|
|
|
+ .hfmax = 17640,
|
|
|
+ .vfmin = 57,
|
|
|
+ .vfmax = 67,
|
|
|
+};
|
|
|
+
|
|
|
+#define AT91SAM9G45_DEFAULT_LCDCON2 (ATMEL_LCDC_MEMOR_LITTLE \
|
|
|
+ | ATMEL_LCDC_DISTYPE_TFT \
|
|
|
+ | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE)
|
|
|
+
|
|
|
+/* Driver datas */
|
|
|
+static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
|
|
|
+ .lcdcon_is_backlight = true,
|
|
|
+ .default_bpp = 32,
|
|
|
+ .default_dmacon = ATMEL_LCDC_DMAEN,
|
|
|
+ .default_lcdcon2 = AT91SAM9G45_DEFAULT_LCDCON2,
|
|
|
+ .default_monspecs = &at91fb_default_monspecs,
|
|
|
+ .guard_time = 9,
|
|
|
+ .lcd_wiring_mode = ATMEL_LCDC_WIRING_RGB,
|
|
|
+};
|
|
|
+
|
|
|
+#else
|
|
|
+static struct atmel_lcdfb_info __initdata ek_lcdc_data;
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * Touchscreen
|
|
|
+ */
|
|
|
+static struct at91_tsadcc_data ek_tsadcc_data = {
|
|
|
+ .adc_clock = 300000,
|
|
|
+ .pendet_debounce = 0x0d,
|
|
|
+ .ts_sample_hold_time = 0x0a,
|
|
|
+};
|
|
|
+
|
|
|
+/*
|
|
|
+ * ADCs
|
|
|
+ */
|
|
|
+static struct at91_adc_data ek_adc_data = {
|
|
|
+ .channels_used = BIT(0) | BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(5) | BIT(6) | BIT(7),
|
|
|
+ .use_external_triggers = true,
|
|
|
+ .vref = 3300,
|
|
|
+};
|
|
|
+
|
|
|
+/*
|
|
|
+ * GPIO Buttons
|
|
|
+ */
|
|
|
+#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
|
|
|
+static struct gpio_keys_button ek_buttons[] = {
|
|
|
+ { /* BP1, "leftclic" */
|
|
|
+ .code = BTN_LEFT,
|
|
|
+ .gpio = AT91_PIN_PB6,
|
|
|
+ .active_low = 1,
|
|
|
+ .desc = "left_click",
|
|
|
+ .wakeup = 1,
|
|
|
+ },
|
|
|
+ { /* BP2, "rightclic" */
|
|
|
+ .code = BTN_RIGHT,
|
|
|
+ .gpio = AT91_PIN_PB7,
|
|
|
+ .active_low = 1,
|
|
|
+ .desc = "right_click",
|
|
|
+ .wakeup = 1,
|
|
|
+ },
|
|
|
+ /* BP3, "joystick" */
|
|
|
+ {
|
|
|
+ .code = KEY_LEFT,
|
|
|
+ .gpio = AT91_PIN_PB14,
|
|
|
+ .active_low = 1,
|
|
|
+ .desc = "Joystick Left",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .code = KEY_RIGHT,
|
|
|
+ .gpio = AT91_PIN_PB15,
|
|
|
+ .active_low = 1,
|
|
|
+ .desc = "Joystick Right",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .code = KEY_UP,
|
|
|
+ .gpio = AT91_PIN_PB16,
|
|
|
+ .active_low = 1,
|
|
|
+ .desc = "Joystick Up",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .code = KEY_DOWN,
|
|
|
+ .gpio = AT91_PIN_PB17,
|
|
|
+ .active_low = 1,
|
|
|
+ .desc = "Joystick Down",
|
|
|
+ },
|
|
|
+ {
|
|
|
+ .code = KEY_ENTER,
|
|
|
+ .gpio = AT91_PIN_PB18,
|
|
|
+ .active_low = 1,
|
|
|
+ .desc = "Joystick Press",
|
|
|
+ },
|
|
|
+};
|
|
|
+
|
|
|
+static struct gpio_keys_platform_data ek_button_data = {
|
|
|
+ .buttons = ek_buttons,
|
|
|
+ .nbuttons = ARRAY_SIZE(ek_buttons),
|
|
|
+};
|
|
|
+
|
|
|
+static struct platform_device ek_button_device = {
|
|
|
+ .name = "gpio-keys",
|
|
|
+ .id = -1,
|
|
|
+ .num_resources = 0,
|
|
|
+ .dev = {
|
|
|
+ .platform_data = &ek_button_data,
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+static void __init ek_add_device_buttons(void)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < ARRAY_SIZE(ek_buttons); i++) {
|
|
|
+ at91_set_GPIO_periph(ek_buttons[i].gpio, 1);
|
|
|
+ at91_set_deglitch(ek_buttons[i].gpio, 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ platform_device_register(&ek_button_device);
|
|
|
+}
|
|
|
+#else
|
|
|
+static void __init ek_add_device_buttons(void) {}
|
|
|
+#endif
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * AC97
|
|
|
+ * reset_pin is not connected: NRST
|
|
|
+ */
|
|
|
+static struct ac97c_platform_data ek_ac97_data = {
|
|
|
+ .reset_pin = -EINVAL,
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+/*
|
|
|
+ * LEDs ... these could all be PWM-driven, for variable brightness
|
|
|
+ */
|
|
|
+static struct gpio_led ek_leds[] = {
|
|
|
+ { /* "top" led, red, powerled */
|
|
|
+ .name = "d8",
|
|
|
+ .gpio = AT91_PIN_PD30,
|
|
|
+ .default_trigger = "heartbeat",
|
|
|
+ },
|
|
|
+ { /* "left" led, green, userled2, pwm3 */
|
|
|
+ .name = "d6",
|
|
|
+ .gpio = AT91_PIN_PD0,
|
|
|
+ .active_low = 1,
|
|
|
+ .default_trigger = "nand-disk",
|
|
|
+ },
|
|
|
+#if !(defined(CONFIG_LEDS_ATMEL_PWM) || defined(CONFIG_LEDS_ATMEL_PWM_MODULE))
|
|
|
+ { /* "right" led, green, userled1, pwm1 */
|
|
|
+ .name = "d7",
|
|
|
+ .gpio = AT91_PIN_PD31,
|
|
|
+ .active_low = 1,
|
|
|
+ .default_trigger = "mmc0",
|
|
|
+ },
|
|
|
+#endif
|
|
|
+};
|
|
|
+
|