rockbox/firmware/target/arm/as3525/sansa-c200v2/button-c200v2.c
Rafaël Carré 3520d8e90e Sansa c200v2 : lcd & backlight support, using the c200v1 lcd driver
The LCD driver is unified and lcd_send_command now takes 2 arguments : the command and its argument.
    If there is no argument, it's set to 0 and a NOP command is issued
    If there is more than one argument (set X/Y address), the 2nd argument is sent as a 2nd command, and a NOP command is issued after it.
    Benefit : c200v2 transfers the command and the argument in one 16 bits transfer
    Performance should not be affected since commands without argument are only used in lcd_init() and lcd_enable()

lcd_send_data() now transfers whole lines (or columns) instead of single pixels
yuv is disabled for c200v2 for now

Some buttons can be read, including left button (bit 6 of DBOP_DIN), but for some reason they have no effect in rockbox: to be investigated

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@21321 a1c6a512-1295-4272-9138-f99709370657
2009-06-17 19:55:27 +00:00

134 lines
3.8 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id: button-e200v2.c 19035 2008-11-07 05:31:05Z jdgordon $
*
* Copyright (C) 2006 by Barry Wardell
*
* 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 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#include "system.h"
#include "button-target.h"
#include "button.h"
#include "backlight.h"
#include "powermgmt.h"
unsigned short _dbop_din = 0;
/* in the lcd driver */
extern bool lcd_button_support(void);
static bool hold_button = false;
#ifndef BOOTLOADER
static bool hold_button_old = false;
#endif
void button_init_device(void)
{
GPIOA_DIR &= ~(1<<3);
}
bool button_hold(void)
{
return hold_button;
}
static void button_read_dbop(void)
{
/* Set up dbop for input */
DBOP_CTRL |= (1<<19); /* Tri-state DBOP on read cycle */
DBOP_CTRL &= ~(1<<16); /* disable output (1:write enabled) */
DBOP_TIMPOL_01 = 0xe167e167; /* Set Timing & Polarity regs 0 & 1 */
DBOP_TIMPOL_23 = 0xe167006e; /* Set Timing & Polarity regs 2 & 3 */
int i = 50;
while(i--) asm volatile ("nop\n");
DBOP_CTRL |= (1<<15); /* start read */
while (!(DBOP_STAT & (1<<16))); /* wait for valid data */
_dbop_din = DBOP_DIN; /* Read dbop data*/
/* Reset dbop for output */
DBOP_TIMPOL_01 = 0x6e167; /* Set Timing & Polarity regs 0 & 1 */
DBOP_TIMPOL_23 = 0xa167e06f; /* Set Timing & Polarity regs 2 & 3 */
DBOP_CTRL |= (1<<16); /* Enable output (0:write disable) */
DBOP_CTRL &= ~(1<<19); /* Tri-state when no active write */
}
/*
* Get button pressed from hardware
*/
int button_read_device(void)
{
int delay;
int dir_save_c = 0;
int afsel_save_c = 0;
int btn = BUTTON_NONE;
/* Save the current direction and afsel */
dir_save_c = GPIOC_DIR;
afsel_save_c = GPIOC_AFSEL;
GPIOC_AFSEL &= ~(1<<6|1<<5|1<<4|1<<3);
GPIOC_DIR |= (1<<6|1<<5|1<<4|1<<3);
/* These should not be needed with button event interupts */
/* they are necessary now to clear out lcd data */
GPIOC_PIN(6) = (1<<6);
GPIOC_PIN(5) = (1<<5);
GPIOC_PIN(4) = (1<<4);
GPIOC_PIN(3) = (1<<3);
GPIOC_DIR &= ~(1<<6|1<<5|1<<4|1<<3);
delay = 100;
while(delay--)
asm volatile("nop\n");
/* direct GPIO connections */
if (GPIOA_PIN(3))
btn |= BUTTON_POWER;
if (!GPIOC_PIN(6))
btn |= BUTTON_RIGHT;
if (!GPIOC_PIN(5))
btn |= BUTTON_UP;
if (!GPIOC_PIN(4))
btn |= BUTTON_SELECT;
if (!GPIOC_PIN(3))
btn |= BUTTON_DOWN;
/* return to settings needed for lcd */
GPIOC_DIR = dir_save_c;
GPIOC_AFSEL = afsel_save_c;
if(lcd_button_support())
button_read_dbop();
if(_dbop_din & (1<<6))
btn |= BUTTON_LEFT;
#ifndef BOOTLOADER
/* light handling */
if (hold_button != hold_button_old)
{
hold_button_old = hold_button;
backlight_hold_changed(hold_button);
}
#endif /* BOOTLOADER */
return btn;
}