diff options
Diffstat (limited to 'drivers/lcd')
| -rw-r--r-- | drivers/lcd/s6d1121_lld.c | 306 | ||||
| -rw-r--r-- | drivers/lcd/s6d1121_lld.h | 44 | ||||
| -rw-r--r-- | drivers/lcd/ssd1289_lld.c | 246 | ||||
| -rw-r--r-- | drivers/lcd/ssd1289_lld.h | 32 |
4 files changed, 628 insertions, 0 deletions
diff --git a/drivers/lcd/s6d1121_lld.c b/drivers/lcd/s6d1121_lld.c new file mode 100644 index 00000000..dfadc19d --- /dev/null +++ b/drivers/lcd/s6d1121_lld.c @@ -0,0 +1,306 @@ +#include "s6d1121_lld.h" + +#ifdef LCD_USE_S6D1121 + +#define LCD_RST_LOW palClearPad(LCD_RST_GPIO, LCD_RST_PIN) +#define LCD_RST_HIGH palSetPad(LCD_RST_GPIO, LCD_RST_PIN) + +#define LCD_CS_LOW palClearPad(LCD_CS_GPIO, LCD_CS_PIN) +#define LCD_CS_HIGH palSetPad(LCD_CS_GPIO, LCD_CS_PIN) + +#define LCD_RS_LOW palClearPad(LCD_RS_GPIO, LCD_RS_PIN) +#define LCD_RS_HIGH palSetPad(LCD_RS_GPIO, LCD_RS_PIN) + +#define LCD_RD_LOW palClearPad(LCD_RD_GPIO, LCD_RD_PIN) +#define LCD_RD_HIGH palSetPad(LCD_RD_GPIO, LCD_RD_PIN) + +#define LCD_WR_LOW palClearPad(LCD_WR_GPIO, LCD_WR_PIN) +#define LCD_WR_HIGH palSetPad(LCD_WR_GPIO, LCD_WR_PIN) + +#define LCD_BL_LOW palClearPad(LCD_BL_GPIO, LCD_BL_PIN) +#define LCD_BL_HIGH palSetPad(LCD_BL_GPIO, LCD_BL_PIN) + +static uint8_t orientation; +extern uint16_t lcd_width, lcd_height; + +inline void lld_lcddelay(void) +{ + asm volatile ("nop"); + asm volatile ("nop"); +} + +inline void lld_lcdwrite(uint16_t db) +{ + LCD_D4_GPIO->BSRR.W=((~db&0xFFF0)<<16)|(db&0xFFF0); + LCD_D0_GPIO->BSRR.W=((~db&0x000F)<<16)|(db&0x000F); + + LCD_WR_LOW; + lld_lcddelay(); + LCD_WR_HIGH; +} + +static __inline uint16_t lcdReadData(void) { + uint16_t value=0; + + LCD_RS_HIGH; + LCD_WR_HIGH; + LCD_RD_LOW; + +#ifndef STM32F4XX + // change pin mode to digital input + LCD_DATA_PORT->CRH = 0x47444444; + LCD_DATA_PORT->CRL = 0x47444444; +#else + +#endif + +// value = palReadPort(LCD_DATA_PORT); // dummy +// value = palReadPort(LCD_DATA_PORT); + +#ifndef STM32F4XX + // change pin mode back to digital output + LCD_DATA_PORT->CRH = 0x33333333; + LCD_DATA_PORT->CRL = 0x33333333; +#else +#endif + LCD_RD_HIGH; + + return value; +} + +static __inline uint16_t lcdReadReg(uint16_t lcdReg) { + uint16_t lcdRAM; + + LCD_CS_LOW; + LCD_RS_LOW; + lld_lcdwrite(lcdReg); + LCD_RS_HIGH; + lcdRAM = lcdReadData(); + + LCD_CS_HIGH; + + return lcdRAM; +} + +void lcdWriteIndex(uint16_t lcdReg) { + LCD_RS_LOW; + + lld_lcdwrite(lcdReg); + + LCD_RS_HIGH; +} + +void lcdWriteData(uint16_t lcdData) { + lld_lcdwrite(lcdData); +} + +void lcdWriteReg(uint16_t lcdReg, uint16_t lcdRegValue) { + LCD_CS_LOW; + + lcdWriteIndex(lcdReg); + lcdWriteData(lcdRegValue); + + LCD_CS_HIGH; +} + +void lld_lcdInit(void) { + // ChibiOS HAL has a nice and precise delay function, + // halPolledDelay(US2RTT(x)); or halPolledDelay(MS2RTT(x)); + // Why Not use it? + // IO Default Configurations + palSetPadMode(LCD_CS_GPIO, LCD_CS_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + palSetPadMode(LCD_WR_GPIO, LCD_WR_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + palSetPadMode(LCD_RD_GPIO, LCD_RD_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + palSetPadMode(LCD_RST_GPIO, LCD_RST_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + palSetPadMode(LCD_RS_GPIO, LCD_RS_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + palSetPadMode(LCD_BL_GPIO, LCD_BL_PIN, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + + palSetGroupMode(LCD_D0_GPIO, 0x0000000F, 0, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + palSetGroupMode(LCD_D4_GPIO, 0x0000FFF0, 0, PAL_MODE_OUTPUT_PUSHPULL | PAL_STM32_OSPEED_HIGHEST); + + LCD_CS_HIGH; + LCD_RST_HIGH; + LCD_RD_HIGH; + LCD_WR_HIGH; + LCD_BL_LOW; + + // A Good idea to reset the module before using + LCD_RST_LOW; + halPolledDelay(MS2RTT(2)); + LCD_RST_HIGH; // Hardware Reset + halPolledDelay(MS2RTT(2)); + + lcdWriteReg(0x11,0x2004); + lcdWriteReg(0x13,0xCC00); + lcdWriteReg(0x15,0x2600); + lcdWriteReg(0x14,0x252A); + lcdWriteReg(0x12,0x0033); + lcdWriteReg(0x13,0xCC04); + + halPolledDelay(MS2RTT(1)); + + lcdWriteReg(0x13,0xCC06); + + halPolledDelay(MS2RTT(1)); + + lcdWriteReg(0x13,0xCC4F); + + halPolledDelay(MS2RTT(1)); + + lcdWriteReg(0x13,0x674F); + lcdWriteReg(0x11,0x2003); + + halPolledDelay(MS2RTT(1)); + + // Gamma Setting + lcdWriteReg(0x30,0x2609); + lcdWriteReg(0x31,0x242C); + lcdWriteReg(0x32,0x1F23); + lcdWriteReg(0x33,0x2425); + lcdWriteReg(0x34,0x2226); + lcdWriteReg(0x35,0x2523); + lcdWriteReg(0x36,0x1C1A); + lcdWriteReg(0x37,0x131D); + lcdWriteReg(0x38,0x0B11); + lcdWriteReg(0x39,0x1210); + lcdWriteReg(0x3A,0x1315); + lcdWriteReg(0x3B,0x3619); + lcdWriteReg(0x3C,0x0D00); + lcdWriteReg(0x3D,0x000D); + + lcdWriteReg(0x16,0x0007); + lcdWriteReg(0x02,0x0013); + lcdWriteReg(0x03,0x0003); + lcdWriteReg(0x01,0x0127); + + halPolledDelay(MS2RTT(1)); + + lcdWriteReg(0x08,0x0303); + lcdWriteReg(0x0A,0x000B); + lcdWriteReg(0x0B,0x0003); + lcdWriteReg(0x0C,0x0000); + lcdWriteReg(0x41,0x0000); + lcdWriteReg(0x50,0x0000); + lcdWriteReg(0x60,0x0005); + lcdWriteReg(0x70,0x000B); + lcdWriteReg(0x71,0x0000); + lcdWriteReg(0x78,0x0000); + lcdWriteReg(0x7A,0x0000); + lcdWriteReg(0x79,0x0007); + lcdWriteReg(0x07,0x0051); + + halPolledDelay(MS2RTT(1)); + + lcdWriteReg(0x07,0x0053); + lcdWriteReg(0x79,0x0000); +} + +void lld_lcdSetCursor(uint16_t x, uint16_t y) { + if(PORTRAIT) { + lcdWriteReg(0x0020, x); + lcdWriteReg(0x0021, y); + } else if(LANDSCAPE) { + lcdWriteReg(0x0020, y); + lcdWriteReg(0x0021, x); + } +} + +// Do not use now, will be fixed in future +void lld_lcdSetOrientation(uint8_t newOrientation) { + orientation = newOrientation; + + switch(orientation) { + case portrait: + lcdWriteReg(0x03, 0x03); + lcd_height = SCREEN_HEIGHT; + lcd_width = SCREEN_WIDTH; + break; + case landscape: + // Not implemented yet + lcd_height = SCREEN_WIDTH; + lcd_width = SCREEN_HEIGHT; + break; + case portraitInv: + // Not implemented yet + lcd_height = SCREEN_HEIGHT; + lcd_width = SCREEN_WIDTH; + break; + case landscapeInv: + // Not implemented yet + lcd_height = SCREEN_WIDTH; + lcd_width = SCREEN_HEIGHT; + break; + } +} + +void lld_lcdSetWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { + lld_lcdSetCursor(x0, y0); + + switch(lcdGetOrientation()) { + case portrait: + lcdWriteReg(0x47, ((x0+x1-1) << 8) | x0); + lcdWriteReg(0x48, y0); + lcdWriteReg(0x47, y0+y1-1); + break; + case landscape: + lcdWriteReg(0x47, ((y0+y1-1) << 8) | y1); + lcdWriteReg(0x48, x0); + lcdWriteReg(0x47, x0+x1-1); + break; + case portraitInv: + lcdWriteReg(0x47, ((x0+x1-1) << 8) | x0); + lcdWriteReg(0x48, y0); + lcdWriteReg(0x47, y0+y1-1); + break; + case landscapeInv: + lcdWriteReg(0x47, ((y0+y1-1) << 8) | y1); + lcdWriteReg(0x48, x0); + lcdWriteReg(0x47, x0+x1-1); + break; + } +} + +void lld_lcdClear(uint16_t color) { + uint32_t index = 0; + + lld_lcdSetCursor(0,0); + LCD_CS_LOW; + lcdWriteIndex(0x0022); + for(index = 0; index < SCREEN_WIDTH * SCREEN_HEIGHT; index++) + lcdWriteData(color); + LCD_CS_HIGH; +} + +// Do not use! +uint16_t lld_lcdGetPixelColor(uint16_t x, uint16_t y) { + uint16_t dummy; + + lld_lcdSetCursor(x,y); + LCD_CS_LOW; + lcdWriteIndex(0x0022); + dummy = lcdReadData(); + dummy = lcdReadData(); + LCD_CS_HIGH; + + return dummy; +} + +void lld_lcdDrawPixel(uint16_t x, uint16_t y, uint16_t color) { + lld_lcdSetCursor(x, y); + lcdWriteReg(0x0022, color); +} + +uint16_t lld_lcdGetOrientation(void) { + return orientation; +} + +uint16_t lld_lcdGetHeight(void) { + return lcd_height; +} + +uint16_t lld_lcdGetWidth(void) { + return lcd_width; +} + +#endif + diff --git a/drivers/lcd/s6d1121_lld.h b/drivers/lcd/s6d1121_lld.h new file mode 100644 index 00000000..173f6e40 --- /dev/null +++ b/drivers/lcd/s6d1121_lld.h @@ -0,0 +1,44 @@ +#ifndef S6D1121_H +#define S6D1121_H + +#include "glcd.h" +#include "glcdconf.h" + +#ifdef LCD_USE_S6D1121 + +// I/O assignments +#define LCD_BL_GPIO GPIOB +#define LCD_BL_PIN 8 + +#define LCD_CS_GPIO GPIOD +#define LCD_CS_PIN 7 + +#define LCD_RS_GPIO GPIOD +#define LCD_RS_PIN 11 + +#define LCD_RST_GPIO GPIOD +#define LCD_RST_PIN 10 + +#define LCD_RD_GPIO GPIOD +#define LCD_RD_PIN 9 + +#define LCD_WR_GPIO GPIOD +#define LCD_WR_PIN 8 + +#define LCD_D0_GPIO GPIOD +#define LCD_D4_GPIO GPIOE + +void lld_lcdInit(void); +void lld_lcdSetCursor(uint16_t x, uint16_t y); +void lld_lcdSetOrientation(uint8_t newOrientation); +void lld_lcdSetWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); +void lld_lcdClear(uint16_t color); +void lld_lcdDrawPixel(uint16_t x, uint16_t y, uint16_t color); +uint16_t lld_lcdGetPixelColor(uint16_t x, uint16_t y); +uint16_t lld_lcdGetOrientation(void); +uint16_t lld_lcdGetHeight(void); +uint16_t lld_lcdGetWidth(void); + +#endif +#endif + diff --git a/drivers/lcd/ssd1289_lld.c b/drivers/lcd/ssd1289_lld.c new file mode 100644 index 00000000..12782e31 --- /dev/null +++ b/drivers/lcd/ssd1289_lld.c @@ -0,0 +1,246 @@ +#include "ssd1289_lld.h" + +#ifdef LCD_USE_SSD1289 + +uint8_t orientation; +uint16_t DeviceCode; +extern uint16_t lcd_width, lcd_height; + +static __inline void lld_lcdWriteIndex(uint16_t index) { + Clr_RS; + Set_RD; + + palWritePort(LCD_DATA_PORT, index); + + Clr_WR; + Set_WR; +} + +static __inline void lld_lcdWriteData(uint16_t data) { + Set_RS; + + palWritePort(LCD_DATA_PORT, data); + + Clr_WR; + Set_WR; +} + +static __inline void lld_lcdWriteReg(uint16_t lcdReg,uint16_t lcdRegValue) { + Clr_CS; + lld_lcdWriteIndex(lcdReg); + lld_lcdWriteData(lcdRegValue); + Set_CS; +} + +static __inline uint16_t lld_lcdReadData(void) { + uint16_t value; + + Set_RS; + Set_WR; + Clr_RD; + + // change pin mode to digital input + LCD_DATA_PORT->CRH = 0x44444444; + LCD_DATA_PORT->CRL = 0x44444444; + + value = palReadPort(LCD_DATA_PORT); // dummy + value = palReadPort(LCD_DATA_PORT); + + // change pin mode back to digital output + LCD_DATA_PORT->CRH = 0x33333333; + LCD_DATA_PORT->CRL = 0x33333333; + + Set_RD; + + return value; +} + +static __inline uint16_t lld_lcdReadReg(uint16_t lcdReg) { + uint16_t lcdRAM; + + Clr_CS; + lld_lcdWriteIndex(lcdReg); + lcdRAM = lld_lcdReadData(); + + Set_CS; + + return lcdRAM; +} + +static __inline void lcdDelay(uint16_t us) { + chThdSleepMicroseconds(us); +} + +void lld_lcdSetCursor(uint16_t x, uint16_t y) { + if(PORTRAIT) { + lld_lcdWriteReg(0x004e, x); + lld_lcdWriteReg(0x004f, y); + } else if(LANDSCAPE) { + lld_lcdWriteReg(0x004e, y); + lld_lcdWriteReg(0x004f, x); + } +} + +void lld_lcdSetOrientation(uint8_t newOrientation) { + orientation = newOrientation; + + switch(orientation) { + case portrait: + lld_lcdWriteReg(0x0001, 0x2B3F); + lld_lcdWriteReg(0x0011, 0x6070); + lcd_height = SCREEN_HEIGHT; + lcd_width = SCREEN_WIDTH; + break; + case landscape: + lld_lcdWriteReg(0x0001, 0x293F); + lld_lcdWriteReg(0x0011, 0x6078); + lcd_height = SCREEN_WIDTH; + lcd_width = SCREEN_HEIGHT; + break; + case portraitInv: + lld_lcdWriteReg(0x0001, 0x693F); + lld_lcdWriteReg(0x0011, 0x6040); + lcd_height = SCREEN_HEIGHT; + lcd_width = SCREEN_WIDTH; + break; + case landscapeInv: + lld_lcdWriteReg(0x0001, 0x6B3F); + lld_lcdWriteReg(0x0011, 0x6048); + lcd_height = SCREEN_WIDTH; + lcd_width = SCREEN_HEIGHT; + break; + } +} + +void lld_lcdSetWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1) { + lld_lcdSetCursor(x0, y0); + + x1 -= x0; + y1 -= y0; + + switch(lcdGetOrientation()) { + case portrait: + lld_lcdWriteReg(0x44, ((x0+x1-1) << 8) | x0); + lld_lcdWriteReg(0x45, y0); + lld_lcdWriteReg(0x46, y0+y1-1); + break; + case landscape: + lld_lcdWriteReg(0x44, ((y0+y1-1) << 8) | y1); + lld_lcdWriteReg(0x45, x0); + lld_lcdWriteReg(0x46, x0+x1-1); + break; + case portraitInv: + lld_lcdWriteReg(0x44, ((x0+x1-1) << 8) | x0); + lld_lcdWriteReg(0x45, y0); + lld_lcdWriteReg(0x46, y0+y1-1); + break; + case landscapeInv: + lld_lcdWriteReg(0x44, ((y0+y1-1) << 8) | y1); + lld_lcdWriteReg(0x45, x0); + lld_lcdWriteReg(0x46, x0+x1-1); + break; + } +} + +void lld_lcdFillArea(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color) { + uint32_t index = 0, area; + + area = ((x1-x0)*(y1-y0)); + + lld_lcdSetWindow(x0, y0, x1, y1); + Clr_CS; + lld_lcdWriteIndex(0x0022); + for(index = 0; index < area; index++) + lld_lcdWriteData(color); + Set_CS; +} + +void lld_lcdClear(uint16_t color) { + uint32_t index = 0; + + lld_lcdSetCursor(0, 0); + Clr_CS; + lld_lcdWriteIndex(0x0022); + for(index = 0; index < SCREEN_WIDTH * SCREEN_HEIGHT; index++) + lld_lcdWriteData(color); + Set_CS; +} + +uint16_t lld_lcdGetPixelColor(uint16_t x, uint16_t y) { + uint16_t dummy; + + lld_lcdSetCursor(x,y); + Clr_CS; + lld_lcdWriteIndex(0x0022); + dummy = lld_lcdReadData(); + dummy = lld_lcdReadData(); + Set_CS; + + return dummy; +} + +void lld_lcdDrawPixel(uint16_t x, uint16_t y, uint16_t color) { + lld_lcdSetCursor(x, y); + lld_lcdWriteReg(0x0022, color); +} + +void lld_lcdInit(void) { + DeviceCode = lld_lcdReadReg(0x0000); + + lld_lcdWriteReg(0x0000,0x0001); lcdDelay(5); + lld_lcdWriteReg(0x0003,0xA8A4); lcdDelay(5); + lld_lcdWriteReg(0x000C,0x0000); lcdDelay(5); + lld_lcdWriteReg(0x000D,0x080C); lcdDelay(5); + lld_lcdWriteReg(0x000E,0x2B00); lcdDelay(5); + lld_lcdWriteReg(0x001E,0x00B0); lcdDelay(5); + lld_lcdWriteReg(0x0001,0x2B3F); lcdDelay(5); + lld_lcdWriteReg(0x0002,0x0600); lcdDelay(5); + lld_lcdWriteReg(0x0010,0x0000); lcdDelay(5); + lld_lcdWriteReg(0x0011,0x6070); lcdDelay(5); + lld_lcdWriteReg(0x0005,0x0000); lcdDelay(5); + lld_lcdWriteReg(0x0006,0x0000); lcdDelay(5); + lld_lcdWriteReg(0x0016,0xEF1C); lcdDelay(5); + lld_lcdWriteReg(0x0017,0x0003); lcdDelay(5); + lld_lcdWriteReg(0x0007,0x0133); lcdDelay(5); + lld_lcdWriteReg(0x000B,0x0000); lcdDelay(5); + lld_lcdWriteReg(0x000F,0x0000); lcdDelay(5); + lld_lcdWriteReg(0x0041,0x0000); lcdDelay(5); + lld_lcdWriteReg(0x0042,0x0000); lcdDelay(5); + lld_lcdWriteReg(0x0048,0x0000); lcdDelay(5); + lld_lcdWriteReg(0x0049,0x013F); lcdDelay(5); + lld_lcdWriteReg(0x004A,0x0000); lcdDelay(5); + lld_lcdWriteReg(0x004B,0x0000); lcdDelay(5); + lld_lcdWriteReg(0x0044,0xEF00); lcdDelay(5); + lld_lcdWriteReg(0x0045,0x0000); lcdDelay(5); + lld_lcdWriteReg(0x0046,0x013F); lcdDelay(5); + lld_lcdWriteReg(0x0030,0x0707); lcdDelay(5); + lld_lcdWriteReg(0x0031,0x0204); lcdDelay(5); + lld_lcdWriteReg(0x0032,0x0204); lcdDelay(5); + lld_lcdWriteReg(0x0033,0x0502); lcdDelay(5); + lld_lcdWriteReg(0x0034,0x0507); lcdDelay(5); + lld_lcdWriteReg(0x0035,0x0204); lcdDelay(5); + lld_lcdWriteReg(0x0036,0x0204); lcdDelay(5); + lld_lcdWriteReg(0x0037,0x0502); lcdDelay(5); + lld_lcdWriteReg(0x003A,0x0302); lcdDelay(5); + lld_lcdWriteReg(0x003B,0x0302); lcdDelay(5); + lld_lcdWriteReg(0x0023,0x0000); lcdDelay(5); + lld_lcdWriteReg(0x0024,0x0000); lcdDelay(5); + lld_lcdWriteReg(0x0025,0x8000); lcdDelay(5); + lld_lcdWriteReg(0x004f,0x0000); lcdDelay(5); + lld_lcdWriteReg(0x004e,0x0000); lcdDelay(5); +} + +uint16_t lld_lcdGetOrientation(void) { + return orientation; +} + +uint16_t lld_lcdGetHeight(void) { + return lcd_height; +} + +uint16_t lld_lcdGetWidth(void) { + return lcd_width; +} + +#endif + diff --git a/drivers/lcd/ssd1289_lld.h b/drivers/lcd/ssd1289_lld.h new file mode 100644 index 00000000..1a98356e --- /dev/null +++ b/drivers/lcd/ssd1289_lld.h @@ -0,0 +1,32 @@ +#ifndef SSD1289_H +#define SSD1289_H + +#include "glcd.h" +#include "glcdconf.h" + +#ifdef LCD_USE_SSD1289 + +#define Set_CS palSetPad(LCD_CMD_PORT, LCD_CS); +#define Clr_CS palClearPad(LCD_CMD_PORT, LCD_CS); +#define Set_RS palSetPad(LCD_CMD_PORT, LCD_RS); +#define Clr_RS palClearPad(LCD_CMD_PORT, LCD_RS); +#define Set_WR palSetPad(LCD_CMD_PORT, LCD_WR); +#define Clr_WR palClearPad(LCD_CMD_PORT, LCD_WR); +#define Set_RD palSetPad(LCD_CMD_PORT, LCD_RD); +#define Clr_RD palClearPad(LCD_CMD_PORT, LCD_RD); + +void lld_lcdInit(void); +void lld_lcdSetCursor(uint16_t x, uint16_t y); +void lld_lcdSetOrientation(uint8_t newOrientation); +void lld_lcdSetWindow(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1); +void lld_lcdClear(uint16_t color); +void lld_lcdDrawPixel(uint16_t x, uint16_t y, uint16_t color); +void lld_lcdFillArea(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color); +uint16_t lld_lcdGetPixelColor(uint16_t x, uint16_t y); +uint16_t lld_lcdGetOrientation(void); +uint16_t lld_lcdGetHeight(void); +uint16_t lld_lcdGetWidth(void); + +#endif +#endif + |
