imx233/fuze+: replace software i2c by hardware i2c, make some code more correct, reduce code size of lcd init sequences

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30120 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Amaury Pouly 2011-07-03 15:18:41 +00:00
parent 22b6def065
commit e36b20c4a1
12 changed files with 237 additions and 234 deletions

View file

@ -488,6 +488,8 @@ target/arm/pnx0101/timer-pnx0101.c
#endif #endif
#if CONFIG_CPU == IMX233 #if CONFIG_CPU == IMX233
target/arm/imx233/i2c-imx233.c
target/arm/imx233/lcdif-imx233.c
target/arm/imx233/clkctrl-imx233.c target/arm/imx233/clkctrl-imx233.c
target/arm/imx233/system-imx233.c target/arm/imx233/system-imx233.c
target/arm/imx233/timrot-imx233.c target/arm/imx233/timrot-imx233.c
@ -1448,13 +1450,11 @@ target/arm/as3525/lcd-as-e200v2-fuze-fuzev2.S
#ifdef SANSA_FUZEPLUS #ifdef SANSA_FUZEPLUS
#ifndef SIMULATOR #ifndef SIMULATOR
#ifndef BOOTLOADER #ifndef BOOTLOADER
drivers/generic_i2c.c
drivers/synaptics-rmi.c drivers/synaptics-rmi.c
#endif #endif
target/arm/imx233/sansa-fuzeplus/backlight-fuzeplus.c target/arm/imx233/sansa-fuzeplus/backlight-fuzeplus.c
target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c target/arm/imx233/sansa-fuzeplus/lcd-fuzeplus.c
target/arm/imx233/sansa-fuzeplus/button-fuzeplus.c target/arm/imx233/sansa-fuzeplus/button-fuzeplus.c
target/arm/imx233/lcdif-imx233.c
#endif /* SIMULATOR */ #endif /* SIMULATOR */
#endif #endif

View file

@ -19,20 +19,18 @@
* *
****************************************************************************/ ****************************************************************************/
#include "system.h" #include "system.h"
#include "generic_i2c.h"
#include "synaptics-rmi.h" #include "synaptics-rmi.h"
#include "i2c.h"
static int rmi_cur_page; static int rmi_cur_page;
static int rmi_i2c_addr; static int rmi_i2c_addr;
static int rmi_i2c_bus;
/* NOTE: /* NOTE:
* RMI over i2c supports some special aliases on page 0x2 but this driver don't * RMI over i2c supports some special aliases on page 0x2 but this driver don't
* use them */ * use them */
int rmi_init(int i2c_bus_index, int i2c_dev_addr) int rmi_init(int i2c_dev_addr)
{ {
rmi_i2c_bus = i2c_bus_index;
rmi_i2c_addr = i2c_dev_addr; rmi_i2c_addr = i2c_dev_addr;
rmi_cur_page = 0x4; rmi_cur_page = 0x4;
return 0; return 0;
@ -44,7 +42,7 @@ static int rmi_select_page(unsigned char page)
if(page != rmi_cur_page) if(page != rmi_cur_page)
{ {
rmi_cur_page = page; rmi_cur_page = page;
return i2c_write_data(rmi_i2c_bus, rmi_i2c_addr, RMI_PAGE_SELECT, &page, 1); return i2c_writemem(rmi_i2c_addr, RMI_PAGE_SELECT, &page, 1);
} }
else else
return 0; return 0;
@ -52,9 +50,10 @@ static int rmi_select_page(unsigned char page)
int rmi_read(int address, int byte_count, unsigned char *buffer) int rmi_read(int address, int byte_count, unsigned char *buffer)
{ {
if(rmi_select_page(address >> 8) < 0) int ret;
return -1; if((ret = rmi_select_page(address >> 8)) < 0)
return i2c_read_data(rmi_i2c_bus, rmi_i2c_addr, address & 0xff, buffer, byte_count); return ret;
return i2c_readmem(rmi_i2c_addr, address & 0xff, buffer, byte_count);
} }
int rmi_read_single(int address) int rmi_read_single(int address)
@ -66,9 +65,10 @@ int rmi_read_single(int address)
int rmi_write(int address, int byte_count, const unsigned char *buffer) int rmi_write(int address, int byte_count, const unsigned char *buffer)
{ {
if(rmi_select_page(address >> 8) < 0) int ret;
return -1; if((ret = rmi_select_page(address >> 8)) < 0)
return i2c_write_data(rmi_i2c_bus, rmi_i2c_addr, address & 0xff, buffer, byte_count); return ret;
return i2c_writemem(rmi_i2c_addr, address & 0xff, buffer, byte_count);
} }
int rmi_write_single(int address, unsigned char byte) int rmi_write_single(int address, unsigned char byte)

View file

@ -27,6 +27,7 @@ extern void i2c_end(void);
extern int i2c_write(int device, const unsigned char* buf, int count ); extern int i2c_write(int device, const unsigned char* buf, int count );
extern int i2c_read(int device, unsigned char* buf, int count ); extern int i2c_read(int device, unsigned char* buf, int count );
extern int i2c_readmem(int device, int address, unsigned char* buf, int count ); extern int i2c_readmem(int device, int address, unsigned char* buf, int count );
extern int i2c_writemem(int device, int address, const unsigned char* buf, int count );
extern void i2c_outb(unsigned char byte); extern void i2c_outb(unsigned char byte);
extern unsigned char i2c_inb(int ack); extern unsigned char i2c_inb(int ack);
extern void i2c_start(void); extern void i2c_start(void);

View file

@ -114,7 +114,7 @@ struct rmi_2d_gesture_data_t
* the generic_i2c driver; the i2c_dev_addr is the i2c address of the device. * the generic_i2c driver; the i2c_dev_addr is the i2c address of the device.
* NOTE: the driver automatically handles the page select mechanism used for * NOTE: the driver automatically handles the page select mechanism used for
* RMI over i2c and assumes a standard page select register at 0xff. */ * RMI over i2c and assumes a standard page select register at 0xff. */
int rmi_init(int i2c_bus_index, int i2c_dev_addr); int rmi_init(int i2c_dev_addr);
/* Read one or more registers. /* Read one or more registers.
* WARNING: don't cross a page boundary ! */ * WARNING: don't cross a page boundary ! */
int rmi_read(int address, int byte_count, unsigned char *buffer); int rmi_read(int address, int byte_count, unsigned char *buffer);

View file

@ -42,6 +42,11 @@
#define HW_CLKCTRL_HBUS__DIV_BP 0 #define HW_CLKCTRL_HBUS__DIV_BP 0
#define HW_CLKCTRL_HBUS__DIV_BM 0x1f #define HW_CLKCTRL_HBUS__DIV_BM 0x1f
#define HW_CLKCTRL_XBUS (*(volatile uint32_t *)(HW_CLKCTRL_BASE + 0x40))
#define HW_CLKCTRL_XBUS__DIV_BP 0
#define HW_CLKCTRL_XBUS__DIV_BM 0x3ff
#define HW_CLKCTRL_XBUS__BUSY (1 << 31)
#define HW_CLKCTRL_XTAL (*(volatile uint32_t *)(HW_CLKCTRL_BASE + 0x50)) #define HW_CLKCTRL_XTAL (*(volatile uint32_t *)(HW_CLKCTRL_BASE + 0x50))
#define HW_CLKCTRL_XTAL__TIMROT_CLK32K_GATE (1 << 26) #define HW_CLKCTRL_XTAL__TIMROT_CLK32K_GATE (1 << 26)

View file

@ -73,6 +73,7 @@
/* APHX channels */ /* APHX channels */
#define HW_APBX_AUDIO_ADC 0 #define HW_APBX_AUDIO_ADC 0
#define HW_APBX_AUDIO_DAC 1 #define HW_APBX_AUDIO_DAC 1
#define HW_APBX_I2C 3
#define HW_APBX_BASE 0x80024000 #define HW_APBX_BASE 0x80024000
@ -123,6 +124,7 @@ struct apb_dma_command_t
#define APB_SSP(ssp) APBH_DMA_CHANNEL(HW_APBH_SSP(ssp)) #define APB_SSP(ssp) APBH_DMA_CHANNEL(HW_APBH_SSP(ssp))
#define APB_AUDIO_ADC APBX_DMA_CHANNEL(HW_APBX_AUDIO_ADC) #define APB_AUDIO_ADC APBX_DMA_CHANNEL(HW_APBX_AUDIO_ADC)
#define APB_I2C APBX_DMA_CHANNEL(HW_APBX_I2C)
#define HW_APB_CHx_CMD__COMMAND_BM 0x3 #define HW_APB_CHx_CMD__COMMAND_BM 0x3
#define HW_APB_CHx_CMD__COMMAND__NO_XFER 0 #define HW_APB_CHx_CMD__COMMAND__NO_XFER 0

View file

@ -53,8 +53,7 @@
static inline void imx233_pinctrl_init(void) static inline void imx233_pinctrl_init(void)
{ {
__REG_CLR(HW_PINCTRL_CTRL) = __BLOCK_CLKGATE; __REG_CLR(HW_PINCTRL_CTRL) = __BLOCK_CLKGATE | __BLOCK_SFTRST;
__REG_CLR(HW_PINCTRL_CTRL) = __BLOCK_SFTRST;
} }
static inline void imx233_set_pin_drive_strength(unsigned bank, unsigned pin, unsigned strength) static inline void imx233_set_pin_drive_strength(unsigned bank, unsigned pin, unsigned strength)

View file

@ -28,59 +28,6 @@
#include "string.h" #include "string.h"
#ifndef BOOTLOADER #ifndef BOOTLOADER
static void i2c_scl_dir(bool out)
{
imx233_enable_gpio_output(0, 30, out);
}
static void i2c_sda_dir(bool out)
{
imx233_enable_gpio_output(0, 31, out);
}
static void i2c_scl_out(bool high)
{
imx233_set_gpio_output(0, 30, high);
}
static void i2c_sda_out(bool high)
{
imx233_set_gpio_output(0, 31, high);
}
static bool i2c_scl_in(void)
{
return imx233_get_gpio_input_mask(0, 1 << 30);
}
static bool i2c_sda_in(void)
{
return imx233_get_gpio_input_mask(0, 1 << 31);
}
static void i2c_delay(int d)
{
udelay(d);
}
struct i2c_interface btn_i2c =
{
.scl_dir = i2c_scl_dir,
.sda_dir = i2c_sda_dir,
.scl_out = i2c_scl_out,
.sda_out = i2c_sda_out,
.scl_in = i2c_scl_in,
.sda_in = i2c_sda_in,
.delay = i2c_delay,
.delay_hd_sta = 4,
.delay_hd_dat = 5,
.delay_su_dat = 1,
.delay_su_sto = 4,
.delay_su_sta = 5,
.delay_thigh = 4
};
int rmi_i2c_bus = -1;
void button_debug_screen(void) void button_debug_screen(void)
{ {
@ -221,9 +168,6 @@ void button_debug_screen(void)
void button_init_device(void) void button_init_device(void)
{ {
rmi_i2c_bus = i2c_add_node(&btn_i2c);
rmi_init(rmi_i2c_bus, 0x40);
/* Synaptics TouchPad information: /* Synaptics TouchPad information:
* - product id: 1533 * - product id: 1533
* - nr function: 1 (0x10 = 2D touchpad) * - nr function: 1 (0x10 = 2D touchpad)
@ -244,7 +188,17 @@ void button_init_device(void)
* - Resolution: 82 * - Resolution: 82
* *
* ATTENTION line: B0P27 asserted low * ATTENTION line: B0P27 asserted low
*
* The B0P26 line seems to be related to the touchpad
*/ */
/* for touchpad ? */
imx233_set_pin_function(0, 26, PINCTRL_FUNCTION_GPIO);
imx233_enable_gpio_output(0, 26, false);
imx233_set_pin_drive_strength(0, 26, PINCTRL_DRIVE_8mA);
rmi_init(0x40);
rmi_write_single(RMI_2D_SENSITIVITY_ADJ, 5); rmi_write_single(RMI_2D_SENSITIVITY_ADJ, 5);
rmi_write_single(RMI_2D_GESTURE_SETTINGS, rmi_write_single(RMI_2D_GESTURE_SETTINGS,
RMI_2D_GESTURE_PRESS_TIME_300MS | RMI_2D_GESTURE_PRESS_TIME_300MS |

View file

@ -62,7 +62,6 @@ static void setup_lcd_pins(bool use_lcdif)
} }
else else
{ {
__REG_SET(HW_PINCTRL_MUXSEL(2)) = 0xffffffff; /* lcd_d{0-15} */ __REG_SET(HW_PINCTRL_MUXSEL(2)) = 0xffffffff; /* lcd_d{0-15} */
imx233_enable_gpio_output_mask(1, 0x3ffffff, false); /* lcd_{d{0-17},reset,rs,wr,cs,dotclk,enable,hsync,vsync} */ imx233_enable_gpio_output_mask(1, 0x3ffffff, false); /* lcd_{d{0-17},reset,rs,wr,cs,dotclk,enable,hsync,vsync} */
imx233_set_pin_function(1, 16, PINCTRL_FUNCTION_GPIO); /* lcd_d16 */ imx233_set_pin_function(1, 16, PINCTRL_FUNCTION_GPIO); /* lcd_d16 */
@ -212,6 +211,28 @@ static uint32_t lcd_read_reg(uint32_t reg)
return decode_18_to_16(data_in); return decode_18_to_16(data_in);
} }
#define REG_MDELAY 0xffffffff
struct lcd_sequence_entry_t
{
uint32_t reg, data;
};
static void lcd_send_sequence(struct lcd_sequence_entry_t *seq, unsigned count)
{
for(;count-- > 0; seq++)
{
if(seq->reg == REG_MDELAY)
mdelay(seq->data);
else
lcd_write_reg(seq->reg, seq->data);
}
}
#define _begin_seq() static struct lcd_sequence_entry_t __seq[] = {
#define _mdelay(a) {REG_MDELAY, a},
#define _lcd_write_reg(a, b) {a, b},
#define _end_seq() }; lcd_send_sequence(__seq, sizeof(__seq) / sizeof(__seq[0]));
static void lcd_init_seq_7783(void) static void lcd_init_seq_7783(void)
{ {
__REG_SET(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RESET; __REG_SET(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RESET;
@ -219,112 +240,117 @@ static void lcd_init_seq_7783(void)
__REG_CLR(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RESET; __REG_CLR(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RESET;
mdelay(10); mdelay(10);
__REG_SET(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RESET; __REG_SET(HW_LCDIF_CTRL1) = HW_LCDIF_CTRL1__RESET;
mdelay(200);
lcd_write_reg(1, 0x100); _begin_seq()
lcd_write_reg(2, 0x700); _mdelay(200)
lcd_write_reg(3, 0x1030); _lcd_write_reg(1, 0x100)
lcd_write_reg(7, 0x121); _lcd_write_reg(2, 0x700)
lcd_write_reg(8, 0x302); _lcd_write_reg(3, 0x1030)
lcd_write_reg(9, 0x200); _lcd_write_reg(7, 0x121)
lcd_write_reg(0xa, 0); _lcd_write_reg(8, 0x302)
lcd_write_reg(0x10, 0x790); _lcd_write_reg(9, 0x200)
lcd_write_reg(0x11, 5); _lcd_write_reg(0xa, 0)
lcd_write_reg(0x12, 0); _lcd_write_reg(0x10, 0x790)
lcd_write_reg(0x13, 0); _lcd_write_reg(0x11, 5)
mdelay(100); _lcd_write_reg(0x12, 0)
lcd_write_reg(0x10, 0x12b0); _lcd_write_reg(0x13, 0)
mdelay(100); _mdelay(100)
lcd_write_reg(0x11, 7); _lcd_write_reg(0x10, 0x12b0)
mdelay(100); _mdelay(100)
lcd_write_reg(0x12, 0x89); _lcd_write_reg(0x11, 7)
lcd_write_reg(0x13, 0x1d00); _mdelay(100)
lcd_write_reg(0x29, 0x2f); _lcd_write_reg(0x12, 0x89)
mdelay(50); _lcd_write_reg(0x13, 0x1d00)
lcd_write_reg(0x30, 0); _lcd_write_reg(0x29, 0x2f)
lcd_write_reg(0x31, 0x505); _mdelay(50)
lcd_write_reg(0x32, 0x205); _lcd_write_reg(0x30, 0)
lcd_write_reg(0x35, 0x206); _lcd_write_reg(0x31, 0x505)
lcd_write_reg(0x36, 0x408); _lcd_write_reg(0x32, 0x205)
lcd_write_reg(0x37, 0); _lcd_write_reg(0x35, 0x206)
lcd_write_reg(0x38, 0x504); _lcd_write_reg(0x36, 0x408)
lcd_write_reg(0x39, 0x206); _lcd_write_reg(0x37, 0)
lcd_write_reg(0x3c, 0x206); _lcd_write_reg(0x38, 0x504)
lcd_write_reg(0x3d, 0x408); _lcd_write_reg(0x39, 0x206)
lcd_write_reg(0x50, 0); /* left X ? */ _lcd_write_reg(0x3c, 0x206)
lcd_write_reg(0x51, 0xef); /* right X ? */ _lcd_write_reg(0x3d, 0x408)
lcd_write_reg(0x52, 0); /* top Y ? */ _lcd_write_reg(0x50, 0) /* left X ? */
lcd_write_reg(0x53, 0x13f); /* bottom Y ? */ _lcd_write_reg(0x51, 0xef) /* right X ? */
lcd_write_reg(0x20, 0); /* left X ? */ _lcd_write_reg(0x52, 0) /* top Y ? */
lcd_write_reg(0x21, 0); /* top Y ? */ _lcd_write_reg(0x53, 0x13f) /* bottom Y ? */
lcd_write_reg(0x60, 0xa700); _lcd_write_reg(0x20, 0) /* left X ? */
lcd_write_reg(0x61, 1); _lcd_write_reg(0x21, 0) /* top Y ? */
lcd_write_reg(0x90, 0x33); _lcd_write_reg(0x60, 0xa700)
lcd_write_reg(0x2b, 0xa); _lcd_write_reg(0x61, 1)
lcd_write_reg(9, 0); _lcd_write_reg(0x90, 0x33)
lcd_write_reg(7, 0x133); _lcd_write_reg(0x2b, 0xa)
mdelay(50); _lcd_write_reg(9, 0)
lcd_write_reg(0x22, 0); _lcd_write_reg(7, 0x133)
_mdelay(50)
_lcd_write_reg(0x22, 0)
_end_seq()
} }
static void lcd_init_seq_9325(void) static void lcd_init_seq_9325(void)
{ {
lcd_write_reg(0xe5, 0x78f0); _begin_seq()
lcd_write_reg(0xe3, 0x3008); _lcd_write_reg(0xe5, 0x78f0)
lcd_write_reg(0xe7, 0x12); _lcd_write_reg(0xe3, 0x3008)
lcd_write_reg(0xef, 0x1231); _lcd_write_reg(0xe7, 0x12)
lcd_write_reg(0, 1); _lcd_write_reg(0xef, 0x1231)
lcd_write_reg(1, 0x100); _lcd_write_reg(0, 1)
lcd_write_reg(2, 0x700); _lcd_write_reg(1, 0x100)
lcd_write_reg(3, 0x1030); _lcd_write_reg(2, 0x700)
lcd_write_reg(4, 0); _lcd_write_reg(3, 0x1030)
lcd_write_reg(8, 0x207); _lcd_write_reg(4, 0)
lcd_write_reg(9, 0); _lcd_write_reg(8, 0x207)
lcd_write_reg(0xa, 0); _lcd_write_reg(9, 0)
lcd_write_reg(0xc, 0); _lcd_write_reg(0xa, 0)
lcd_write_reg(0xd, 0); _lcd_write_reg(0xc, 0)
lcd_write_reg(0xf, 0); _lcd_write_reg(0xd, 0)
lcd_write_reg(0x10, 0); _lcd_write_reg(0xf, 0)
lcd_write_reg(0x11, 7); _lcd_write_reg(0x10, 0)
lcd_write_reg(0x12, 0); _lcd_write_reg(0x11, 7)
lcd_write_reg(0x13, 0); _lcd_write_reg(0x12, 0)
mdelay(20); _lcd_write_reg(0x13, 0)
lcd_write_reg(0x10, 0x1290); _mdelay(20)
lcd_write_reg(0x11, 7); _lcd_write_reg(0x10, 0x1290)
mdelay(50); _lcd_write_reg(0x11, 7)
lcd_write_reg(0x12, 0x19); _mdelay(50)
mdelay(50); _lcd_write_reg(0x12, 0x19)
lcd_write_reg(0x13, 0x1700); _mdelay(50)
lcd_write_reg(0x29, 0x14); _lcd_write_reg(0x13, 0x1700)
mdelay(50); _lcd_write_reg(0x29, 0x14)
lcd_write_reg(0x20, 0); _mdelay(50)
lcd_write_reg(0x21, 0); _lcd_write_reg(0x20, 0)
lcd_write_reg(0x30, 0x504); _lcd_write_reg(0x21, 0)
lcd_write_reg(0x31, 7); _lcd_write_reg(0x30, 0x504)
lcd_write_reg(0x32, 6); _lcd_write_reg(0x31, 7)
lcd_write_reg(0x35, 0x106); _lcd_write_reg(0x32, 6)
lcd_write_reg(0x36, 0x202); _lcd_write_reg(0x35, 0x106)
lcd_write_reg(0x37, 0x504); _lcd_write_reg(0x36, 0x202)
lcd_write_reg(0x38, 0x500); _lcd_write_reg(0x37, 0x504)
lcd_write_reg(0x39, 0x706); _lcd_write_reg(0x38, 0x500)
lcd_write_reg(0x3c, 0x204); _lcd_write_reg(0x39, 0x706)
lcd_write_reg(0x3d, 0x202); _lcd_write_reg(0x3c, 0x204)
lcd_write_reg(0x50, 0); _lcd_write_reg(0x3d, 0x202)
lcd_write_reg(0x51, 0xef); _lcd_write_reg(0x50, 0)
lcd_write_reg(0x52, 0); _lcd_write_reg(0x51, 0xef)
lcd_write_reg(0x53, 0x13f); _lcd_write_reg(0x52, 0)
lcd_write_reg(0x60, 0xa700); _lcd_write_reg(0x53, 0x13f)
lcd_write_reg(0x61, 1); _lcd_write_reg(0x60, 0xa700)
lcd_write_reg(0x6a, 1); _lcd_write_reg(0x61, 1)
lcd_write_reg(0x2b, 0xd); _lcd_write_reg(0x6a, 1)
mdelay(50); _lcd_write_reg(0x2b, 0xd)
lcd_write_reg(0x90, 0x11); _mdelay(50)
lcd_write_reg(0x92, 0x600); _lcd_write_reg(0x90, 0x11)
lcd_write_reg(0x93, 3); _lcd_write_reg(0x92, 0x600)
lcd_write_reg(0x95, 0x110); _lcd_write_reg(0x93, 3)
lcd_write_reg(0x97, 0); _lcd_write_reg(0x95, 0x110)
lcd_write_reg(0x98, 0); _lcd_write_reg(0x97, 0)
lcd_write_reg(7, 0x173); _lcd_write_reg(0x98, 0)
lcd_write_reg(0x22, 0); _lcd_write_reg(7, 0x173)
_lcd_write_reg(0x22, 0)
_end_seq()
} }
void lcd_init_device(void) void lcd_init_device(void)
@ -334,16 +360,9 @@ void lcd_init_device(void)
for(int i = 0; i < 10; i++) for(int i = 0; i < 10; i++)
{ {
uint32_t kind = lcd_read_reg(0); lcd_kind = lcd_read_reg(0);
if(kind == LCD_KIND_7783 || kind == LCD_KIND_9325) if(lcd_kind == LCD_KIND_7783 || lcd_kind == LCD_KIND_9325)
{
lcd_kind = kind;
break; break;
}
else
{
lcd_kind = LCD_KIND_OTHER;
}
} }
mdelay(5); mdelay(5);
switch(lcd_kind) switch(lcd_kind)
@ -351,6 +370,7 @@ void lcd_init_device(void)
case LCD_KIND_7783: lcd_init_seq_7783(); break; case LCD_KIND_7783: lcd_init_seq_7783(); break;
case LCD_KIND_9325: lcd_init_seq_9325(); break; case LCD_KIND_9325: lcd_init_seq_9325(); break;
default: default:
lcd_kind = LCD_KIND_9325;
lcd_init_seq_7783(); break; lcd_init_seq_7783(); break;
} }
} }
@ -360,30 +380,34 @@ static void lcd_enable_7783(bool enable)
{ {
if(!enable) if(!enable)
{ {
lcd_write_reg(7, 0x131); _begin_seq()
mdelay(50); _lcd_write_reg(7, 0x131)
lcd_write_reg(7, 0x20); _mdelay(50)
mdelay(50); _lcd_write_reg(7, 0x20)
lcd_write_reg(0x10, 0x82); _mdelay(50)
mdelay(50); _lcd_write_reg(0x10, 0x82)
_mdelay(50)
_end_seq()
} }
else else
{ {
lcd_write_reg(0x11, 5); _begin_seq()
lcd_write_reg(0x10, 0x12b0); _lcd_write_reg(0x11, 5)
mdelay(50); _lcd_write_reg(0x10, 0x12b0)
lcd_write_reg(7, 0x11); _mdelay(50)
mdelay(50); _lcd_write_reg(7, 0x11)
lcd_write_reg(0x12, 0x89); _mdelay(50)
mdelay(50); _lcd_write_reg(0x12, 0x89)
lcd_write_reg(0x13, 0x1d00); _mdelay(50)
mdelay(50); _lcd_write_reg(0x13, 0x1d00)
lcd_write_reg(0x29, 0x2f); _mdelay(50)
mdelay(50); _lcd_write_reg(0x29, 0x2f)
lcd_write_reg(0x2b, 0xa); _mdelay(50)
lcd_write_reg(7, 0x133); _lcd_write_reg(0x2b, 0xa)
mdelay(50); _lcd_write_reg(7, 0x133)
lcd_write_reg(0x22, 0); _mdelay(50)
_lcd_write_reg(0x22, 0)
_end_seq()
} }
} }
@ -391,36 +415,40 @@ static void lcd_enable_9325(bool enable)
{ {
if(!enable) if(!enable)
{ {
lcd_write_reg(7, 0x131); _begin_seq()
mdelay(10); _lcd_write_reg(7, 0x131)
lcd_write_reg(7, 0x130); _mdelay(10)
mdelay(10); _lcd_write_reg(7, 0x130)
lcd_write_reg(7, 0); _mdelay(10)
lcd_write_reg(0x10, 0x80); _lcd_write_reg(7, 0)
lcd_write_reg(0x11, 0); _lcd_write_reg(0x10, 0x80)
lcd_write_reg(0x12, 0); _lcd_write_reg(0x11, 0)
lcd_write_reg(0x13, 0); _lcd_write_reg(0x12, 0)
mdelay(200); _lcd_write_reg(0x13, 0)
lcd_write_reg(0x10, 0x82); _mdelay(200)
_lcd_write_reg(0x10, 0x82)
_end_seq()
} }
else else
{ {
lcd_write_reg(0x10, 0x80); _begin_seq()
lcd_write_reg(0x11, 0); _lcd_write_reg(0x10, 0x80)
lcd_write_reg(0x12, 0); _lcd_write_reg(0x11, 0)
lcd_write_reg(0x13, 0); _lcd_write_reg(0x12, 0)
lcd_write_reg(7, 1); _lcd_write_reg(0x13, 0)
mdelay(200); _lcd_write_reg(7, 1)
lcd_write_reg(0x10, 0x1290); _mdelay(200)
lcd_write_reg(0x11, 7); _lcd_write_reg(0x10, 0x1290)
mdelay(50); _lcd_write_reg(0x11, 7)
lcd_write_reg(0x12, 0x19); _mdelay(50)
mdelay(50); _lcd_write_reg(0x12, 0x19)
lcd_write_reg(0x13, 0x1700); _mdelay(50)
lcd_write_reg(0x29, 0x10); _lcd_write_reg(0x13, 0x1700)
mdelay(50); _lcd_write_reg(0x29, 0x10)
lcd_write_reg(7, 0x133); _mdelay(50)
lcd_write_reg(0x22, 0); _lcd_write_reg(7, 0x133)
_lcd_write_reg(0x22, 0)
_end_seq()
} }
} }

View file

@ -258,6 +258,7 @@ enum imx233_ssp_error_t imx233_ssp_sd_mmc_transfer(int ssp, uint8_t cmd,
(3 << HW_APB_CHx_CMD__CMDWORDS_BP) | (3 << HW_APB_CHx_CMD__CMDWORDS_BP) |
(xfer_size << HW_APB_CHx_CMD__XFER_COUNT_BP); (xfer_size << HW_APB_CHx_CMD__XFER_COUNT_BP);
__REG_CLR(HW_SSP_CTRL1(ssp)) = HW_SSP_CTRL1__ALL_IRQ;
imx233_dma_reset_channel(APB_SSP(ssp)); imx233_dma_reset_channel(APB_SSP(ssp));
imx233_dma_start_command(APB_SSP(ssp), &ssp_dma_cmd[ssp - 1].dma); imx233_dma_start_command(APB_SSP(ssp), &ssp_dma_cmd[ssp - 1].dma);
@ -266,7 +267,10 @@ enum imx233_ssp_error_t imx233_ssp_sd_mmc_transfer(int ssp, uint8_t cmd,
enum imx233_ssp_error_t ret; enum imx233_ssp_error_t ret;
if(semaphore_wait(&ssp_sema[ssp - 1], HZ) == OBJ_WAIT_TIMEDOUT) if(semaphore_wait(&ssp_sema[ssp - 1], HZ) == OBJ_WAIT_TIMEDOUT)
{
imx233_dma_reset_channel(APB_SSP(ssp));
ret = SSP_TIMEOUT; ret = SSP_TIMEOUT;
}
else if((HW_SSP_CTRL1(ssp) & HW_SSP_CTRL1__ALL_IRQ) == 0) else if((HW_SSP_CTRL1(ssp) & HW_SSP_CTRL1__ALL_IRQ) == 0)
ret = SSP_SUCCESS; ret = SSP_SUCCESS;
else if(HW_SSP_CTRL1(ssp) & (HW_SSP_CTRL1__RESP_TIMEOUT_IRQ | else if(HW_SSP_CTRL1(ssp) & (HW_SSP_CTRL1__RESP_TIMEOUT_IRQ |

View file

@ -29,6 +29,7 @@
#include "timrot-imx233.h" #include "timrot-imx233.h"
#include "dma-imx233.h" #include "dma-imx233.h"
#include "ssp-imx233.h" #include "ssp-imx233.h"
#include "i2c-imx233.h"
#include "lcd.h" #include "lcd.h"
#include "backlight-target.h" #include "backlight-target.h"
#include "button-target.h" #include "button-target.h"
@ -51,6 +52,8 @@ default_interrupt(INT_SSP1_DMA);
default_interrupt(INT_SSP1_ERROR); default_interrupt(INT_SSP1_ERROR);
default_interrupt(INT_SSP2_DMA); default_interrupt(INT_SSP2_DMA);
default_interrupt(INT_SSP2_ERROR); default_interrupt(INT_SSP2_ERROR);
default_interrupt(INT_I2C_DMA);
default_interrupt(INT_I2C_ERROR);
typedef void (*isr_t)(void); typedef void (*isr_t)(void);
@ -66,7 +69,9 @@ static isr_t isr_table[INT_SRC_NR_SOURCES] =
[INT_SRC_SSP1_DMA] = INT_SSP1_DMA, [INT_SRC_SSP1_DMA] = INT_SSP1_DMA,
[INT_SRC_SSP1_ERROR] = INT_SSP1_ERROR, [INT_SRC_SSP1_ERROR] = INT_SSP1_ERROR,
[INT_SRC_SSP2_DMA] = INT_SSP2_DMA, [INT_SRC_SSP2_DMA] = INT_SSP2_DMA,
[INT_SRC_SSP2_ERROR] = INT_SSP2_ERROR [INT_SRC_SSP2_ERROR] = INT_SSP2_ERROR,
[INT_SRC_I2C_DMA] = INT_I2C_DMA,
[INT_SRC_I2C_ERROR] = INT_I2C_ERROR,
}; };
static void UIRQ(void) static void UIRQ(void)
@ -147,6 +152,9 @@ void system_init(void)
imx233_timrot_init(); imx233_timrot_init();
imx233_dma_init(); imx233_dma_init();
imx233_ssp_init(); imx233_ssp_init();
#ifndef BOOTLOADER
imx233_i2c_init();
#endif
} }
void power_off(void) void power_off(void)

View file

@ -87,6 +87,8 @@
#define INT_SRC_SSP1_DMA 14 #define INT_SRC_SSP1_DMA 14
#define INT_SRC_SSP1_ERROR 15 #define INT_SRC_SSP1_ERROR 15
#define INT_SRC_SSP2_DMA 20 #define INT_SRC_SSP2_DMA 20
#define INT_SRC_I2C_DMA 26
#define INT_SRC_I2C_ERROR 27
#define INT_SRC_TIMER(nr) (28 + (nr)) #define INT_SRC_TIMER(nr) (28 + (nr))
#define INT_SRC_LCDIF_DMA 45 #define INT_SRC_LCDIF_DMA 45
#define INT_SRC_LCDIF_ERROR 46 #define INT_SRC_LCDIF_ERROR 46