The atmel_lcdfb driver, supporting both AT91 and AVR32 chips, was merged during the 2.6.22 release cycle. This was based on the old sidsafb driver, but contains a lot of improvements and will eventually replace it. Platform- and board specific code for AT32AP7000 and ATSTK1000 was merged as well, but not the Ltv350qvDriver, which is necessary for initializing the LCD panel on ATSTK1000.
The atmel_lcdfb driver requires a bit of board-specific code to work. First, to add a PlatformDevice? for the LCDC, you need to call at32_add_device_lcdc() like this:
at32_add_device_lcdc(0, &board_lcdc_data, fbmem_start, fbmem_size);The parameters have the following meaning: 1. First, the device ID. Since the AP7000 only has one LCDC device, this must be 0. 1. Then, the board-specific data. This will be explained below. 1.
fbmem_start is the physical address of a preallocated framebuffer. The AVR32 core code will initialize this global variable if the argument fbmem=_size_[@_start_] is passed on the command line. 1. fbmem_size is the size of a preallocated framebuffer. The AVR32 core code will initialize this as well from the fbmem= argument. Set it to 0 if you don't want to use a preallocated framebuffer.
The board-specific data is a struct of type struct atmel_lcdfb_info which is defined in
default_bppdefault_dmaconATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN. Some chips don't support panning in the x-direction; the AP7000 does.default_lcdcon2ATMEL_LCDC_MEMOR_BIG should probably always be set on AVR32.default_monspecsstruct fb_monspecs type variable. The struct is defined in guard_timeThe following settings work with the LTV350QV TFT display on ATSTK1000.
static struct fb_videomode __initdata ltv350qv_modes[] = {
{
.name = "320x240 @ 75",
.refresh = 75,
.xres = 320, .yres = 240,
.pixclock = KHZ2PICOS(6891),
.left_margin = 17, .right_margin = 33,
.upper_margin = 10, .lower_margin = 10,
.hsync_len = 16, .vsync_len = 1,
.sync = 0,
.vmode = FB_VMODE_NONINTERLACED,
},
};
static struct fb_monspecs __initdata atstk1000_default_monspecs = {
.manufacturer = "SNG",
.monitor = "LTV350QV",
.modedb = ltv350qv_modes,
.modedb_len = ARRAY_SIZE(ltv350qv_modes),
.hfmin = 14820,
.hfmax = 22230,
.vfmin = 60,
.vfmax = 90,
.dclkmax = 30000000,
};
struct atmel_lcdfb_info __initdata atstk1000_lcdc_data = {
.default_bpp = 24,
.default_dmacon = ATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN,
.default_lcdcon2 = (ATMEL_LCDC_DISTYPE_TFT
| ATMEL_LCDC_INVCLK
| ATMEL_LCDC_CLKMOD_ALWAYSACTIVE
| ATMEL_LCDC_MEMOR_BIG),
.default_monspecs = &atstk1000_default_monspecs,
.guard_time = 2,
};