mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-09 13:12:37 -05:00
Remote LCD communication driver for X5, very loosely based on patch FS#5634 by Rani Hod
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10331 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
b98b895bab
commit
40a3fd6938
5 changed files with 220 additions and 0 deletions
|
|
@ -21,5 +21,7 @@
|
|||
|
||||
void __backlight_on(void);
|
||||
void __backlight_off(void);
|
||||
void __remote_backlight_on(void);
|
||||
void __remote_backlight_off(void);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -35,3 +35,13 @@ void __backlight_off(void)
|
|||
pcf50606_write(0x38, 0x80); /* Backlight OFF, GPO1INV=1, GPO1ACT=000 */
|
||||
set_irq_level(level);
|
||||
}
|
||||
|
||||
void __remote_backlight_on(void)
|
||||
{
|
||||
and_l(~0x00200000, &GPIO_OUT);
|
||||
}
|
||||
|
||||
void __remote_backlight_off(void)
|
||||
{
|
||||
or_l(0x00200000, &GPIO_OUT);
|
||||
}
|
||||
|
|
|
|||
30
firmware/target/coldfire/iaudio/x5/lcd-remote-target.h
Executable file
30
firmware/target/coldfire/iaudio/x5/lcd-remote-target.h
Executable file
|
|
@ -0,0 +1,30 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2006 by Linus Nielsen Feltzing
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#ifndef LCD_REMOTE_TARGET_H
|
||||
#define LCD_REMOTE_TARGET_H
|
||||
|
||||
void lcd_remote_write_command(int cmd);
|
||||
void lcd_remote_write_command_ex(int cmd, int data);
|
||||
void lcd_remote_write_data(const unsigned char* p_bytes, int count);
|
||||
bool remote_detect(void);
|
||||
void lcd_remote_powersave(bool on);
|
||||
void lcd_remote_set_contrast(int val);
|
||||
void remote_set_row_and_col(int row, int col);
|
||||
|
||||
#endif
|
||||
177
firmware/target/coldfire/iaudio/x5/lcd-remote-x5.c
Executable file
177
firmware/target/coldfire/iaudio/x5/lcd-remote-x5.c
Executable file
|
|
@ -0,0 +1,177 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2006 by Linus Nielsen Feltzing
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#include "config.h"
|
||||
#include "system.h"
|
||||
#include "kernel.h"
|
||||
|
||||
/* The LCD in the iAudio M3/M5/X5 remote control is a Tomato LSI 0350 */
|
||||
|
||||
#define LCD_SET_DUTY_RATIO 0x48
|
||||
#define LCD_SELECT_ADC 0xa0
|
||||
#define LCD_SELECT_SHL 0xc0
|
||||
#define LCD_SET_COM0 0x44
|
||||
#define LCD_OSC_ON 0xab
|
||||
#define LCD_SELECT_DCDC 0x64
|
||||
#define LCD_SELECT_RES 0x20
|
||||
#define LCD_SET_VOLUME 0x81
|
||||
#define LCD_SET_BIAS 0x50
|
||||
#define LCD_CONTROL_POWER 0x28
|
||||
#define LCD_DISPLAY_ON 0xae
|
||||
#define LCD_SET_INITLINE 0x40
|
||||
#define LCD_SET_COLUMN 0x10
|
||||
#define LCD_SET_PAGE 0xb0
|
||||
#define LCD_SET_GRAY 0x88
|
||||
#define LCD_SET_PWM_FRC 0x90
|
||||
#define LCD_SET_POWER_SAVE 0xa8
|
||||
|
||||
#define CS_LO and_l(~0x00000020, &GPIO1_OUT)
|
||||
#define CS_HI or_l(0x00000020, &GPIO1_OUT)
|
||||
#define CLK_LO and_l(~0x00004000, &GPIO_OUT)
|
||||
#define CLK_HI or_l(0x00004000, &GPIO_OUT)
|
||||
#define DATA_LO and_l(~0x00002000, &GPIO_OUT)
|
||||
#define DATA_HI or_l(0x00002000, &GPIO_OUT)
|
||||
#define RS_LO and_l(~0x00008000, &GPIO_OUT)
|
||||
#define RS_HI or_l(0x00008000, &GPIO_OUT)
|
||||
|
||||
#define LCD_REMOTE_DEFAULT_CONTRAST 0x18;
|
||||
|
||||
static int cached_contrast = LCD_REMOTE_DEFAULT_CONTRAST;
|
||||
static bool remote_initialized = false;
|
||||
|
||||
static void remote_write(unsigned char byte, bool is_command)
|
||||
{
|
||||
int i;
|
||||
|
||||
CS_LO;
|
||||
if (is_command)
|
||||
RS_LO;
|
||||
else
|
||||
RS_HI;
|
||||
|
||||
for (i = 0x80; i; i >>= 1)
|
||||
{
|
||||
CLK_LO;
|
||||
if (i & byte)
|
||||
DATA_HI;
|
||||
else
|
||||
DATA_LO;
|
||||
CLK_HI;
|
||||
}
|
||||
|
||||
CS_HI;
|
||||
}
|
||||
|
||||
void lcd_remote_write_command(int cmd)
|
||||
{
|
||||
remote_write(cmd, true);
|
||||
}
|
||||
|
||||
void lcd_remote_write_command_ex(int cmd, int data)
|
||||
{
|
||||
remote_write(cmd, true);
|
||||
remote_write(data, true);
|
||||
}
|
||||
|
||||
void lcd_remote_write_data(const unsigned char* p_bytes, int count)
|
||||
{
|
||||
while(count--)
|
||||
remote_write(*p_bytes++, false);
|
||||
}
|
||||
|
||||
void remote_set_row_and_col(int row, int col)
|
||||
{
|
||||
lcd_remote_write_command(LCD_SET_PAGE | (row & 0xf));
|
||||
lcd_remote_write_command_ex(LCD_SET_COLUMN | ((col >> 4) & 0xf),
|
||||
col & 0xf);
|
||||
}
|
||||
|
||||
int lcd_remote_default_contrast(void)
|
||||
{
|
||||
return LCD_REMOTE_DEFAULT_CONTRAST;
|
||||
}
|
||||
|
||||
void lcd_remote_powersave(bool on)
|
||||
{
|
||||
if (on)
|
||||
lcd_remote_write_command(LCD_SET_POWER_SAVE | 1);
|
||||
else
|
||||
lcd_remote_write_command(LCD_SET_POWER_SAVE | 1);
|
||||
}
|
||||
|
||||
void lcd_remote_set_contrast(int val)
|
||||
{
|
||||
cached_contrast = val;
|
||||
lcd_remote_write_command_ex(LCD_SET_VOLUME, val);
|
||||
}
|
||||
|
||||
bool remote_detect(void)
|
||||
{
|
||||
return (GPIO_READ & 0x01000000);
|
||||
}
|
||||
|
||||
void remote_init(void)
|
||||
{
|
||||
or_l(0x0000e000, &GPIO_OUT);
|
||||
or_l(0x0000e000, &GPIO_ENABLE);
|
||||
or_l(0x0000e000, &GPIO_FUNCTION);
|
||||
|
||||
or_l(0x00000020, &GPIO1_OUT);
|
||||
or_l(0x00000020, &GPIO1_ENABLE);
|
||||
or_l(0x00000020, &GPIO1_FUNCTION);
|
||||
|
||||
sleep(10);
|
||||
|
||||
lcd_remote_write_command(LCD_SET_DUTY_RATIO);
|
||||
lcd_remote_write_command(0x70); /* 1/128 */
|
||||
|
||||
lcd_remote_write_command(LCD_SELECT_ADC | 1); /* Reverse direction */
|
||||
lcd_remote_write_command(LCD_SELECT_SHL | 8); /* Reverse direction */
|
||||
|
||||
lcd_remote_write_command(LCD_SET_COM0);
|
||||
lcd_remote_write_command(0x00);
|
||||
|
||||
lcd_remote_write_command(LCD_OSC_ON);
|
||||
|
||||
lcd_remote_write_command(LCD_SELECT_DCDC | 2); /* DC/DC 5xboost */
|
||||
|
||||
lcd_remote_write_command(LCD_SELECT_RES | 7); /* Regulator resistor: 7.2 */
|
||||
|
||||
lcd_remote_write_command(LCD_SET_BIAS | 6); /* 1/11 */
|
||||
|
||||
lcd_remote_write_command(LCD_CONTROL_POWER | 7); /* All circuits ON */
|
||||
|
||||
sleep(30);
|
||||
|
||||
lcd_remote_write_command_ex(LCD_SET_GRAY | 0, 0x00);
|
||||
lcd_remote_write_command_ex(LCD_SET_GRAY | 1, 0x00);
|
||||
lcd_remote_write_command_ex(LCD_SET_GRAY | 2, 0x0c);
|
||||
lcd_remote_write_command_ex(LCD_SET_GRAY | 3, 0x00);
|
||||
lcd_remote_write_command_ex(LCD_SET_GRAY | 4, 0xcc);
|
||||
lcd_remote_write_command_ex(LCD_SET_GRAY | 5, 0x00);
|
||||
lcd_remote_write_command_ex(LCD_SET_GRAY | 6, 0xcc);
|
||||
lcd_remote_write_command_ex(LCD_SET_GRAY | 7, 0x0c);
|
||||
|
||||
lcd_remote_write_command(LCD_SET_PWM_FRC | 6); /* 4FRC + 12PWM */
|
||||
|
||||
lcd_remote_write_command(LCD_DISPLAY_ON | 1); /* display on */
|
||||
|
||||
remote_initialized = true;
|
||||
|
||||
lcd_remote_set_contrast(cached_contrast);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue