1
0
mirror of git://projects.qi-hardware.com/iris.git synced 2024-08-22 04:08:05 +03:00
iris/boot-programs/lcd.ccp

115 lines
2.9 KiB
Plaintext
Raw Normal View History

2009-06-10 22:42:01 +03:00
#pypp 0
// Iris: micro-kernel for a capability-based operating system.
2009-06-24 01:47:13 +03:00
// boot-programs/lcd.ccp: Display driver.
2009-06-10 22:42:01 +03:00
// Copyright 2009 Bas Wijnen <wijnen@debian.org>
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
2009-06-10 23:54:12 +03:00
#include "devices.hh"
2009-06-22 18:48:05 +03:00
#define ARCH
#include "arch.hh"
2009-06-10 22:42:01 +03:00
// Pin definitions, all in port 2.
#define PWM_ENABLE (1 << 30)
#define SPEN (1 << 0) //LCD_SPL
#define SPCK (1 << 1) //LCD_CLS
#define SPDA (1 << 2) //LCD_PS
#define LCD_RET (1 << 3) //LCD_REV //use for lcd reset
2009-07-04 17:21:28 +03:00
static void set_backlight (bool state):
if state:
PWM_DUT (0) = 300
2009-06-10 23:54:12 +03:00
PWM_CTR (0) = 0xbf
GPIO_GPDR (2) |= PWM_ENABLE
2009-06-10 22:42:01 +03:00
else:
2009-07-04 17:21:28 +03:00
PWM_DUT (0) = 0
2009-06-10 23:54:12 +03:00
PWM_CTR (0) = 0x3f
GPIO_GPDR (2) &= ~PWM_ENABLE
2009-06-10 22:42:01 +03:00
static void reset ():
2009-07-04 17:21:28 +03:00
PWM_PER (0) = 300
2009-07-05 11:52:44 +03:00
set_backlight (false)
2009-07-04 17:21:28 +03:00
2009-06-10 22:42:01 +03:00
// initialize things.
2009-06-10 23:54:12 +03:00
GPIO_GPIER (2) &= ~(PWM_ENABLE | LCD_RET | SPEN | SPCK | SPDA)
GPIO_GPDIR (2) |= PWM_ENABLE | LCD_RET | SPEN | SPCK | SPDA
2009-06-10 22:42:01 +03:00
udelay (50)
2009-06-10 23:54:12 +03:00
GPIO_GPDR (2) &= ~LCD_RET
2009-07-05 11:52:44 +03:00
ddelay (2)
2009-06-10 23:54:12 +03:00
GPIO_GPDR (2) |= LCD_RET
2009-07-05 11:52:44 +03:00
ddelay (1)
2009-06-10 22:42:01 +03:00
// For now, support only 16 bpp.
// Screen is 800x480 tft.
2009-07-05 11:52:44 +03:00
unsigned h = 800, v = 480, hs = 80, vs = 20, fps = 60, Bpp = 2
2009-06-10 22:42:01 +03:00
LCD_CTRL = LCD_CTRL_BPP_16 | LCD_CTRL_BST_16
2009-07-05 11:52:44 +03:00
LCD_VSYNC = vs
LCD_HSYNC = hs
LCD_DAV = (vs << 16) | (vs + v)
LCD_DAH = (hs << 16) | (hs + h)
LCD_VAT = ((hs + h) << 16) | (vs + v)
#define MODE_TFT_GEN 0
#define PCLK_N (1 << 10)
#define VSYNC_N (1 << 8)
LCD_CFG = MODE_TFT_GEN | PCLK_N | VSYNC_N
cpm_stop_lcd ()
2009-06-10 22:42:01 +03:00
2009-07-04 17:21:28 +03:00
unsigned pllout = cpm_get_pllout ()
2009-07-05 11:52:44 +03:00
unsigned pixclock = fps * (hs + h) * (vs + v)
CPM_CFCR2 = pllout / pixclock - 1
unsigned val = pllout / (pixclock * 4) - 1
while val < 0xf && pllout / (val + 1) > 150000000:
++val
cpm_set_lcdclk_div (val)
CPM_CFCR |= CPM_CFCR_UPE
cpm_start_lcd ()
2009-06-10 22:42:01 +03:00
2009-07-04 17:21:28 +03:00
udelay (1000)
2009-07-05 11:52:44 +03:00
//LCD_DA0 = framebuffer
unsigned frame_size = v * h * Bpp
LCD_CMD0 = LCD_CMD_SOFINT | LCD_CMD_EOFINT | (frame_size << LCD_CMD_LEN_BIT)
lcd_set_ena ()
lcd_enable_eof_intr ()
2009-06-10 22:42:01 +03:00
int main ():
2009-06-10 23:54:12 +03:00
map_gpio ()
map_pwm0 ()
map_lcd ()
map_cpm ()
2009-06-10 22:42:01 +03:00
reset ()
2009-07-05 11:52:44 +03:00
register_interrupt (IRQ_LCD)
set_backlight (true)
2009-06-22 17:13:00 +03:00
2009-06-10 22:42:01 +03:00
while true:
Message msg
if !wait (&msg):
continue
switch msg.protected_data:
2009-07-05 11:52:44 +03:00
case IRQ_LCD:
kdebug (0)
LCD_STATE &= ~LCD_STATE_EOF
register_interrupt (IRQ_LCD)
// TODO: allow callback
break
2009-06-10 22:42:01 +03:00
case LCD_BACKLIGHT:
2009-07-04 17:21:28 +03:00
set_backlight (msg.data[0])
2009-06-10 22:42:01 +03:00
break
case LCD_RESET:
reset ()
break