# lcdc.h File Reference

## Detailed Description

LCD controller example driver.

This file defines a usefull set of functions for the SIDSA LCD controller on the AVR32 devices.

- Compiler: IAR EWAVR32 amd GNU GCC for AVR32
- Supported devices: All AVR32AP devices with a SIDSA LCD controller
- AppNote: AVR32114 Using the AVR32 LCD controller

Author:
  Atmel Corporation: http://www.atmel.com
  Support and FAQ: http://support.atmel.no/

Definition in file lcdc.h.

`#include <avr32/io.h>`

Go to the source code of this file.

## Data Structures
struct | lcdc_configuration_s
| Struct that defines the configuration of the LCD controller. More...
## Defines
#define | LCDC_ALWAYS_ACTIVE 1
#define | LCDC_BIG_ENDIAN 0
#define | LCDC_BPP_1 1
#define | LCDC_BPP_16 16
#define | LCDC_BPP_2 2
#define | LCDC_BPP_24 24
#define | LCDC_BPP_32 32
#define | LCDC_BPP_4 4
#define | LCDC_BPP_8 8
#define | LCDC_DISABLED 0
#define | LCDC_DUAL_SCAN 1
#define | LCDC_EACH_FRAME 0
#define | LCDC_ENABLED 1
#define | LCDC_IF_WIDTH16 2
#define | LCDC_IF_WIDTH4 0
#define | LCDC_IF_WIDTH8 1
#define | LCDC_INVERTED 1
#define | LCDC_LITTLE_ENDIAN 1
#define | LCDC_MODE_2D_OFF 0
#define | LCDC_MODE_2D_ON 1
#define | LCDC_MVAL_DEFINED 1
#define | LCDC_NORMAL 0
#define | LCDC_PARTLY_ACTIVE 0
#define | LCDC_PRE_EIGTH 3
#define | LCDC_PRE_FOURTH 2
#define | LCDC_PRE_HALF 1
#define | LCDC_PRE_NONE 0
#define | LCDC_SINGLE_SCAN 0
#define | LCDC_STN_COLOR 1
#define | LCDC_STN_MONO 0
#define | LCDC_TFT 2
#define | LCDC_WIN_CE 2
## Typedefs
typedef struct lcdc_configuration_s | lcdc_conf_t
| Struct that defines the configuration of the LCD controller.
## Functions
int | lcdc_init (lcdc_conf_t *lcdc_conf)
| Configures the LCD module.

## Define Documentation

#define LCDC_ALWAYS_ACTIVE 1

Definition at line 292 of file lcdc.h.

#define LCDC_BIG_ENDIAN 0

Definition at line 265 of file lcdc.h.

#define LCDC_BPP_1 1

Definition at line 272 of file lcdc.h.

#define LCDC_BPP_16 16

Definition at line 276 of file lcdc.h.

#define LCDC_BPP_2 2

Definition at line 273 of file lcdc.h.

#define LCDC_BPP_24 24

Definition at line 277 of file lcdc.h.

#define LCDC_BPP_32 32

Definition at line 278 of file lcdc.h.

#define LCDC_BPP_4 4

Definition at line 274 of file lcdc.h.

#define LCDC_BPP_8 8

Definition at line 275 of file lcdc.h.

#define LCDC_DISABLED 0

Definition at line 284 of file lcdc.h.

#define LCDC_DUAL_SCAN 1

Definition at line 259 of file lcdc.h.

Referenced by lcdc_init().

#define LCDC_EACH_FRAME 0

Definition at line 294 of file lcdc.h.

#define LCDC_ENABLED 1

Definition at line 283 of file lcdc.h.

#define LCDC_IF_WIDTH16 2

Definition at line 263 of file lcdc.h.

Referenced by lcdc_init().

#define LCDC_IF_WIDTH4 0

Definition at line 261 of file lcdc.h.

Referenced by lcdc_init().

#define LCDC_IF_WIDTH8 1

Definition at line 262 of file lcdc.h.

Referenced by lcdc_init().

#define LCDC_INVERTED 1

Definition at line 281 of file lcdc.h.

#define LCDC_LITTLE_ENDIAN 1

Definition at line 266 of file lcdc.h.

#define LCDC_MODE_2D_OFF 0

Definition at line 270 of file lcdc.h.

#define LCDC_MODE_2D_ON 1

Definition at line 269 of file lcdc.h.

#define LCDC_MVAL_DEFINED 1

Definition at line 295 of file lcdc.h.

#define LCDC_NORMAL 0

Definition at line 280 of file lcdc.h.

#define LCDC_PARTLY_ACTIVE 0

Definition at line 291 of file lcdc.h.

#define LCDC_PRE_EIGTH 3

Definition at line 289 of file lcdc.h.

#define LCDC_PRE_FOURTH 2

Definition at line 288 of file lcdc.h.

#define LCDC_PRE_HALF 1

Definition at line 287 of file lcdc.h.

#define LCDC_PRE_NONE 0

Definition at line 286 of file lcdc.h.

#define LCDC_SINGLE_SCAN 0

Definition at line 258 of file lcdc.h.

Referenced by lcdc_init().

#define LCDC_STN_COLOR 1

Definition at line 255 of file lcdc.h.

Referenced by lcdc_init().

#define LCDC_STN_MONO 0

Definition at line 254 of file lcdc.h.

Referenced by lcdc_init().

#define LCDC_TFT 2

Definition at line 256 of file lcdc.h.

Referenced by lcdc_init().

#define LCDC_WIN_CE 2

Definition at line 267 of file lcdc.h.

## Typedef Documentation

typedef struct lcdc_configuration_s lcdc_conf_t

Struct that defines the configuration of the LCD controller.

## Function Documentation

int lcdc_init | ( | lcdc_conf_t * | lcdc_conf | ) |

Configures the LCD module.

Parameters:

  | lcdc_conf | Pointer to LCD controller configuration structure

Returns:
  Status

Return values:

  | 0 | = success
  | -1 | = failure

Parameters:

  | lcdc_conf | Pointer to LCD controller configuration structure

Returns:
  Status

Return values:

  | 0 | = success
  | -1 | = invalid argument

Definition at line 57 of file lcdc.c.

References lcdc_configuration_s::burst_length, lcdc_configuration_s::clkmod, lcdc_configuration_s::ctrst_ena, lcdc_configuration_s::ctrst_pol, lcdc_configuration_s::ctrst_ps, lcdc_configuration_s::ctrstval, lcdc_configuration_s::distype, lcdc_configuration_s::dmabaddr1, lcdc_configuration_s::dmabaddr2, lcdc_configuration_s::frame_rate, lcdc_configuration_s::guard_time, lcdc_configuration_s::hbp, lcdc_configuration_s::hfp, lcdc_configuration_s::hpw, lcdc_configuration_s::ifwidth, lcdc_configuration_s::invclk, lcdc_configuration_s::invdval, lcdc_configuration_s::invframe, lcdc_configuration_s::invline, lcdc_configuration_s::invvd, LCDC_DUAL_SCAN, LCDC_IF_WIDTH16, LCDC_IF_WIDTH4, LCDC_IF_WIDTH8, LCDC_SINGLE_SCAN, LCDC_STN_COLOR, LCDC_STN_MONO, LCDC_TFT, lcdc_configuration_s::lcdcclock, lcdc_configuration_s::memor, lcdc_configuration_s::mmode, lcdc_configuration_s::mval, lcdc_configuration_s::pixelsize, lcdc_configuration_s::scanmod, lcdc_configuration_s::set2dmode, lcdc_configuration_s::vbp, lcdc_configuration_s::vfp, lcdc_configuration_s::vhdly, lcdc_configuration_s::virtual_xres, lcdc_configuration_s::vpw, lcdc_configuration_s::xres, and lcdc_configuration_s::yres.

Referenced by main().

    00058 {
    00059   volatile avr32_lcdc_t *plcdc = &AVR32_LCDC;
    00060   unsigned char valid_data_lines = 0;
    00061   unsigned char pixel_size = 0;
    00062   unsigned char clkval = 0;
    00063   unsigned int pixel_clock_theo = 0;
    00064   unsigned short lineval, hozval;
    00065
    00066   /* Turn off LCD Controller (core first then DMA) */
    00067   plcdc->pwrcon &= ~(1 << AVR32_LCDC_PWRCON_PWR_OFFSET);
    00068   plcdc->dmacon &= ~(1 << AVR32_LCDC_DMACON_DMAEN_OFFSET);
    00069
    00070   /* LCDFRCFG */
    00071   if(lcdc_conf->distype != LCDC_TFT){
    00072     switch(lcdc_conf->scanmod){
    00073     case LCDC_SINGLE_SCAN:
    00074       switch(lcdc_conf->ifwidth){
    00075       case LCDC_IF_WIDTH4:
    00076         valid_data_lines = 4;
    00077         break;
    00078       case LCDC_IF_WIDTH8:
    00079         valid_data_lines = 8;
    00080         break;
    00081       default:
    00082         return -1;
    00083     }
    00084
    00085     case LCDC_DUAL_SCAN:
    00086       switch(lcdc_conf->ifwidth){
    00087       case LCDC_IF_WIDTH8:
    00088         valid_data_lines = 4;
    00089         break;
    00090       case LCDC_IF_WIDTH16:
    00091         valid_data_lines = 8;
    00092         break;
    00093       default:
    00094         return -1;
    00095       }
    00096     default:
    00097       return -1;
    00098     }
    00099   }
    00100
    00101   lineval = lcdc_conf->yres - 1;
    00102   switch(lcdc_conf->distype){
    00103   case LCDC_STN_MONO:
    00104     hozval = (lcdc_conf->xres / valid_data_lines) - 1;
    00105     break;
    00106   case LCDC_STN_COLOR:
    00107     hozval = (lcdc_conf->xres * 3 / valid_data_lines) - 1;
    00108     break;
    00109   case LCDC_TFT:
    00110     hozval = lcdc_conf->xres - 1;
    00111     break;
    00112   default:
    00113     return -1;
    00114   }
    00115   plcdc->lcdfrmcfg = (lineval & AVR32_LCDC_LINEVAL_MASK) |
    00116       ((hozval << AVR32_LCDC_HOZVAL) & AVR32_LCDC_HOZVAL_MASK);
    00117
    00118   /* Calculation of theoretical pixel clock */
    00119   switch(lcdc_conf->distype){
    00120     case LCDC_STN_MONO:
    00121       pixel_clock_theo = lcdc_conf->frame_rate * lcdc_conf->xres * lcdc_conf->yres / valid_data_lines;
    00122       break;
    00123     case LCDC_STN_COLOR:
    00124       pixel_clock_theo = lcdc_conf->frame_rate * lcdc_conf->xres * lcdc_conf->yres * 3 / valid_data_lines;
    00125       break;
    00126     case LCDC_TFT:
    00127       pixel_clock_theo = lcdc_conf->frame_rate * lcdc_conf->xres * lcdc_conf->yres;
    00128       break;
    00129     default:
    00130       return -1;
    00131   }
    00132   clkval = (lcdc_conf->lcdcclock / (2 * pixel_clock_theo));
    00133   if (clkval == 0) {
    00134     plcdc->lcdcon1 = 1; /* bypass pixel clock */
    00135   } else {
    00136     plcdc->lcdcon1 = ((clkval - 1) << AVR32_LCDC_LCDCON1_CLKVAL) & AVR32_LCDC_LCDCON1_CLKVAL_MASK;
    00137   }
    00138
    00139   /* LCDCON2 */
    00140   switch(lcdc_conf->pixelsize){
    00141     case 1: pixel_size = 0;break;
    00142     case 2: pixel_size = 1;break;
    00143     case 4: pixel_size = 2;break;
    00144     case 8: pixel_size = 3;break;
    00145     case 16: pixel_size = 4;break;
    00146     case 24: pixel_size = 5;break;
    00147     case 32: pixel_size = 6;break;
    00148     default:
    00149       return -1;
    00150   }
    00151   plcdc->lcdcon2 = (lcdc_conf->distype & AVR32_LCDC_LCDCON2_DISTYPE_MASK) |
    00152       ((lcdc_conf->scanmod << AVR32_LCDC_LCDCON2_SCANMOD) & AVR32_LCDC_LCDCON2_SCANMOD_MASK) |
    00153       ((lcdc_conf->ifwidth << AVR32_LCDC_LCDCON2_IFWIDTH) & AVR32_LCDC_LCDCON2_IFWIDTH_MASK) |
    00154       ((lcdc_conf->invvd << AVR32_LCDC_LCDCON2_INVVD) & AVR32_LCDC_LCDCON2_INVVD_MASK) |
    00155       ((lcdc_conf->invframe << AVR32_LCDC_LCDCON2_INVFRAME) & AVR32_LCDC_LCDCON2_INVFRAME_MASK) |
    00156       ((pixel_size << AVR32_LCDC_LCDCON2_PIXELSIZE) & AVR32_LCDC_LCDCON2_PIXELSIZE_MASK) |
    00157       ((lcdc_conf->invline << AVR32_LCDC_LCDCON2_INVLINE) & AVR32_LCDC_LCDCON2_INVLINE_MASK) |
    00158       ((lcdc_conf->invclk << AVR32_LCDC_LCDCON2_INVCLK) & AVR32_LCDC_LCDCON2_INVCLK_MASK) |
    00159       ((lcdc_conf->invdval << AVR32_LCDC_LCDCON2_INVDVAL) & AVR32_LCDC_LCDCON2_INVDVAL_MASK) |
    00160       ((lcdc_conf->clkmod << AVR32_LCDC_LCDCON2_CLKMOD) & AVR32_LCDC_LCDCON2_CLKMOD_MASK) |
    00161       ((lcdc_conf->memor << AVR32_LCDC_LCDCON2_MEMOR) & AVR32_LCDC_LCDCON2_MEMOR_MASK);
    00162
    00163   /* Timings */
    00164   plcdc->lcdtim1 = (lcdc_conf->vfp & AVR32_LCDC_LCDTIM1_VFP_MASK) |
    00165       ((lcdc_conf->vbp << AVR32_LCDC_LCDTIM1_VBP) & AVR32_LCDC_LCDTIM1_VBP_MASK) |
    00166       (((lcdc_conf->vpw - 1) << AVR32_LCDC_LCDTIM1_VPW) & AVR32_LCDC_LCDTIM1_VPW_MASK) |
    00167       ((lcdc_conf->vhdly << AVR32_LCDC_LCDTIM1_VHDLY) & AVR32_LCDC_LCDTIM1_VHDLY_MASK);
    00168
    00169   plcdc->lcdtim2 = (lcdc_conf->hbp & AVR32_LCDC_HBP_MASK) |
    00170       (((lcdc_conf->hpw - 1) << AVR32_LCDC_LCDTIM2_HPW) & AVR32_LCDC_LCDTIM2_HPW_MASK) |
    00171       ((lcdc_conf->hfp << AVR32_LCDC_LCDTIM2_HFP) & AVR32_LCDC_LCDTIM2_HFP_MASK);
    00172
    00173   /* Interrupts */
    00174   plcdc->idr = 0xFFFFFFFF;
    00175
    00176   /* Toggle rate */
    00177   plcdc->lcdmval = (lcdc_conf->mval & AVR32_LCDC_LCDMVAL_MVAL_MASK) |
    00178       ((lcdc_conf->mmode << AVR32_LCDC_LCDMVAL_MMODE_OFFSET) & AVR32_LCDC_LCDMVAL_MMODE_MASK);
    00179
    00180   /* Contrast */
    00181   plcdc->contrast_val = lcdc_conf->ctrstval;
    00182   plcdc->contrast_ctr = (lcdc_conf->ctrst_ps & AVR32_LCDC_CONTRAST_CTR_PS_MASK) |
    00183       ((lcdc_conf->ctrst_pol << AVR32_LCDC_CONTRAST_CTR_POL_OFFSET) & AVR32_LCDC_CONTRAST_CTR_POL_MASK) |
    00184       ((lcdc_conf->ctrst_ena << AVR32_LCDC_CONTRAST_CTR_ENA_OFFSET) & AVR32_LCDC_CONTRAST_CTR_ENA_MASK);
    00185
    00186   /* Setup FIFO */
    00187   int lcd_fifo_size = lcdc_conf->scanmod ? 256 : 512;
    00188   plcdc->lcdfifo = lcd_fifo_size - (2 * lcdc_conf->burst_length + 3);
    00189
    00190   /* DMA base address */
    00191   plcdc->dmabaddr1 = lcdc_conf->dmabaddr1;
    00192   if(lcdc_conf->scanmod == LCDC_DUAL_SCAN){
    00193     plcdc->dmabaddr2 = lcdc_conf->dmabaddr2;
    00194   }
    00195   /* DMA frame configuration
    00196   * The frame size is measured in words
    00197   */
    00198   plcdc->dmafrmcfg = ((((lcdc_conf->xres * lcdc_conf->yres * lcdc_conf->pixelsize) + 31 )/ 32) & AVR32_LCDC_DMAFRMCFG_FRMSIZE_MASK) |
    00199       (((lcdc_conf->burst_length - 1) << AVR32_LCDC_DMAFRMCFG_BRSTLEN) & AVR32_LCDC_DMAFRMCFG_BRSTLEN_MASK);
    00200
    00201   /* 2D configuration */
    00202   if(lcdc_conf->set2dmode){
    00203     /* Assumed is that the frame starts at a word boundary -> no pixel offset needed */
    00204     plcdc->dma2dcfg = ((lcdc_conf->virtual_xres - lcdc_conf->xres) * (lcdc_conf->pixelsize / 8)) & AVR32_LCDC_DMA2DCFG_ADDRINC_MASK;
    00205   }
    00206
    00207   /* wait for DMA engine to become idle */
    00208   while (plcdc->dmacon & AVR32_LCDC_DMACON_DMABUSY);
    00209
    00210   /* and enable DMA with updated configuration */
    00211   if(lcdc_conf->set2dmode){
    00212     plcdc->dmacon = (1 << AVR32_LCDC_DMACON_DMAEN_OFFSET) |
    00213       (1 << AVR32_LCDC_DMACON_DMAUPDT_OFFSET) |
    00214       (1 << AVR32_LCDC_DMACON_DMA2DEN_OFFSET);
    00215   }
    00216   else{
    00217     plcdc->dmacon = (1 << AVR32_LCDC_DMACON_DMAEN_OFFSET) |
    00218       (1 << AVR32_LCDC_DMACON_DMAUPDT_OFFSET);
    00219   }
    00220   /* enable LCD */
    00221   plcdc->pwrcon |= (lcdc_conf->guard_time << AVR32_LCDC_PWRCON_GUARD_TIME_OFFSET) & AVR32_LCDC_PWRCON_GUARD_TIME_MASK;
    00222
    00223   /* Wait for the LCDC core to become idle and enable it */
    00224   while (plcdc->PWRCON.busy == 1);
    00225   plcdc->PWRCON.pwr = 1;
    00226
    00227   return 0;
    00228 }