From: arighi Date: Fri, 9 Apr 2010 14:27:35 +0000 (+0000) Subject: lm3s1968: use the generic OLED-RIT-128x96 (P14201) driver in the example. X-Git-Tag: 2.5.0~500 X-Git-Url: https://codewiz.org/gitweb?a=commitdiff_plain;h=c05941e41ee333ab29af6bb62ecc08862c7321fd;p=bertos.git lm3s1968: use the generic OLED-RIT-128x96 (P14201) driver in the example. git-svn-id: https://src.develer.com/svnoss/bertos/trunk@3408 38d2e660-2303-0410-9eaa-f027e97ec537 --- diff --git a/examples/lm3s1968/hw/hw_lcd.h b/examples/lm3s1968/hw/hw_lcd.h new file mode 100644 index 00000000..abffecc8 --- /dev/null +++ b/examples/lm3s1968/hw/hw_lcd.h @@ -0,0 +1,131 @@ +/** + * \file + * + * + * \brief LM3S1986: OLED-RIT-128x96 (P14201) low-level hardware macros + * + * \author Andrea Righi + */ + +#ifndef HW_LCD_H +#define HW_LCD_H + +#include /* BV() */ +#include + +#include +#include +#include + +#include +#include +#include + +#include + +/** + * \name LCD I/O pins/ports + * @{ + */ +/* OLED Data/Command control pin */ +#define GPIO_OLEDDC_PIN BV(2) + +/* OLED enable pin */ +#define GPIO_OLEDEN_PIN BV(3) +/*@}*/ + +/** + * \name LCD bus control macros + * @{ + */ +/* Enter command mode */ +#define LCD_SET_COMMAND() \ + lm3s_gpio_pin_write(GPIO_PORTH_BASE, GPIO_OLEDDC_PIN, 0) + +/* Enter data mode */ +#define LCD_SET_DATA() \ + lm3s_gpio_pin_write(GPIO_PORTH_BASE, GPIO_OLEDDC_PIN, GPIO_OLEDDC_PIN) + +/* Send data to the display */ +#define LCD_WRITE(x) lm3s_ssiWriteFrame(SSI0_BASE, x) + +/* Read data from the display */ +#define LCD_READ() \ + ({ \ + uint32_t frame; \ + lm3s_ssiReadFrame(SSI0_BASE, &frame); \ + frame; \ + }) +/*@}*/ + +INLINE void lcd_bus_init(void) +{ + cpu_flags_t flags; + uint32_t dummy; + + IRQ_SAVE_DISABLE(flags); + + /* Enable the peripheral clock */ + SYSCTL_RCGC1_R |= SYSCTL_RCGC1_SSI0; + SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOA; + SYSCTL_RCGC2_R |= SYSCTL_RCGC2_GPIOH; + __delay(512); + + /* Configure the SSI0CLK and SSIOTX pins for SSI operation. */ + lm3s_gpio_pin_config(GPIO_PORTA_BASE, BV(2) | BV(3) | BV(5), + GPIO_DIR_MODE_HW, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU); + /* + * Configure the GPIO port pin used as a D/C# signal (data/command + * control) for OLED device, and the port pin used to enable power to + * the OLED panel. + */ + lm3s_gpio_pin_config(GPIO_PORTH_BASE, GPIO_OLEDDC_PIN | GPIO_OLEDEN_PIN, + GPIO_DIR_MODE_OUT, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD); + lm3s_gpio_pin_write(GPIO_PORTH_BASE, GPIO_OLEDDC_PIN | GPIO_OLEDEN_PIN, + GPIO_OLEDDC_PIN | GPIO_OLEDEN_PIN); + + /* Configure the SSI0 port for master mode */ + lm3s_ssiOpen(SSI0_BASE, SSI_FRF_MOTO_MODE_2, + SSI_MODE_MASTER, CPU_FREQ / 2, 8); + /* + * Configure the GPIO port pin used as a D/Cn signal for OLED device, + * and the port pin used to enable power to the OLED panel. + */ + lm3s_gpio_pin_config(GPIO_PORTA_BASE, GPIO_OLEDEN_PIN, + GPIO_DIR_MODE_HW, GPIO_STRENGTH_8MA, GPIO_PIN_TYPE_STD_WPU); + + /* Drain the SSI RX FIFO */ + while (lm3s_ssiReadFrameNonBlocking(SSI0_BASE, &dummy)); + + IRQ_RESTORE(flags); +} + +#endif /* HW_LCD_H */ diff --git a/examples/lm3s1968/lm3s1968.c b/examples/lm3s1968/lm3s1968.c index aec08cec..46451e5e 100644 --- a/examples/lm3s1968/lm3s1968.c +++ b/examples/lm3s1968/lm3s1968.c @@ -39,7 +39,6 @@ #include #include #include -#include #include #include #include @@ -47,6 +46,8 @@ #include #include +#include "hw/hw_lcd.h" + #define PROC_STACK_SIZE KERN_MINSTACKSIZE * 2 #if CONFIG_KERN_HEAP @@ -133,7 +134,7 @@ static void NORETURN res_process(void) ((end - start) * 1000000) / CPU_FREQ, ((end - start) * (100000000 / CPU_FREQ)) % 100); text_xprintf(&bm, 7, 0, TEXT_FILL, buffer); - lm3s_lcd_blitBitmap(&bm); + rit128x96_lcd_blitBitmap(&bm); /* Blink the status LED and restart the test */ led_off(); @@ -190,11 +191,12 @@ static void bouncing_logo(Bitmap *bm) } /* Update graphics */ + gfx_bitmapClear(bm); gfx_blitImage(bm, (LCD_WIDTH - bertos_logo.width) / 2, (LCD_HEIGHT - bertos_logo.height) / 2 + h / SPEED_SCALE, &bertos_logo); - lm3s_lcd_blitBitmap(bm); + rit128x96_lcd_blitBitmap(bm); timer_delay(5); } } @@ -216,25 +218,24 @@ int main(void) proc_init(); kputs("Done.\n"); kputs("Init OLED display.."); - lm3s_lcd_init(CPU_FREQ / 2); + rit128x96_lcd_init(); gfx_bitmapInit(&bm, raster, LCD_WIDTH, LCD_HEIGHT); gfx_setFont(&bm, &font_helvB10); kputs("Done.\n"); bouncing_logo(&bm); - gfx_bitmapClear(&bm); #ifdef _DEBUG text_xprintf(&bm, 4, 0, TEXT_CENTER | TEXT_FILL, "BeRTOS up & running!"); - lm3s_lcd_blitBitmap(&bm); + rit128x96_lcd_blitBitmap(&bm); proc_testRun(); #endif snprintf(buffer, sizeof(buffer), "CPU: Cortex-M3 %luMHz", CPU_FREQ / 1000000); text_xprintf(&bm, 0, 0, TEXT_FILL, buffer); - lm3s_lcd_blitBitmap(&bm); + rit128x96_lcd_blitBitmap(&bm); text_xprintf(&bm, 1, 0, TEXT_FILL, "Board: LM3S1968 EVB"); - lm3s_lcd_blitBitmap(&bm); + rit128x96_lcd_blitBitmap(&bm); hp_proc = proc_new(hp_process, NULL, PROC_STACK_SIZE, hp_stack); lp_proc = proc_new(lp_process, NULL, PROC_STACK_SIZE, lp_stack); diff --git a/examples/lm3s1968/lm3s1968.mk b/examples/lm3s1968/lm3s1968.mk index d2432f4f..4d09c0ba 100644 --- a/examples/lm3s1968/lm3s1968.mk +++ b/examples/lm3s1968/lm3s1968.mk @@ -33,6 +33,7 @@ lm3s1968_CSRC = \ bertos/mware/event.c \ bertos/struct/heap.c \ bertos/drv/timer.c \ + bertos/drv/lcd_rit128x96.c \ bertos/kern/monitor.c \ bertos/kern/proc_test.c \ bertos/kern/proc.c \ @@ -45,7 +46,6 @@ lm3s1968_CSRC = \ bertos/cpu/cortex-m3/drv/clock_lm3s.c \ bertos/cpu/cortex-m3/drv/kdebug_lm3s.c \ bertos/cpu/cortex-m3/drv/ssi_lm3s.c \ - bertos/cpu/cortex-m3/drv/lcd_lm3s.c \ bertos/cpu/cortex-m3/hw/init_lm3s.c lm3s1968_CPPASRC = \