X-Git-Url: https://rtime.felk.cvut.cz/gitweb/l4.git/blobdiff_plain/615241fa4695499799cebfd8a6dc8d90f3a93f13..5658d2ec9c1081516a8868259fa867926e25ab3f:/l4/pkg/drivers/lcd/src/lcd-amba.c diff --git a/l4/pkg/drivers/lcd/src/lcd-amba.c b/l4/pkg/drivers/lcd/src/lcd-amba.c index 09cc6fe14..5c87a30d6 100644 --- a/l4/pkg/drivers/lcd/src/lcd-amba.c +++ b/l4/pkg/drivers/lcd/src/lcd-amba.c @@ -4,7 +4,6 @@ #include #include -#include #include #include #include @@ -108,12 +107,15 @@ static void setup_type(void) amba_read_id(amba_pl110_lcd_control_virt_base + 0xfe0, &periphid, &cellid); - if (periphid == 0x00041111 && cellid == 0xb105f00d) + if ((periphid & 0xff0fffff) == 0x00041111 && cellid == 0xb105f00d) type = PL111; else if (periphid == 0x00041110 && cellid == 0xb105f00d) type = PL110; else - type = PL_UNKNOWN; + { + printf("Unknown LCD: periphid = %08x, cellid = %08x\n", periphid, cellid); + type = PL_UNKNOWN; + } } static const char *arm_lcd_get_info(void) @@ -122,15 +124,15 @@ static const char *arm_lcd_get_info(void) } static -l4_umword_t read_sys_reg(unsigned reg) +l4_uint32_t read_sys_reg(unsigned reg) { - return io_read_mword(amba_pl110_sys_base_virt + reg); + return *((volatile l4_uint32_t *)(amba_pl110_sys_base_virt + reg)); } static -void write_sys_reg(unsigned reg, l4_umword_t val) +void write_sys_reg(unsigned reg, l4_uint32_t val) { - io_write_mword(amba_pl110_sys_base_virt + reg, val); + *((volatile l4_uint32_t *)(amba_pl110_sys_base_virt + reg)) = val; } static @@ -142,15 +144,21 @@ void set_clcd_clock(l4_umword_t val) } static -l4_umword_t read_clcd_reg(unsigned reg) +l4_uint32_t read_clcd_reg(unsigned reg) { - return *((volatile l4_umword_t *)(amba_pl110_lcd_control_virt_base + reg)); + return *((volatile l4_uint32_t *)(amba_pl110_lcd_control_virt_base + reg)); } static void write_clcd_reg(unsigned reg, l4_umword_t val) { - *((volatile l4_umword_t *)(amba_pl110_lcd_control_virt_base + reg)) = val; + *((volatile l4_uint32_t *)(amba_pl110_lcd_control_virt_base + reg)) = val; +} + +static +unsigned is_vexpress(void) +{ + return (read_sys_reg(Reg_sys_id) & 0xfff0000) == 0x1900000; } static @@ -159,11 +167,12 @@ int init(unsigned long fb_phys_addr) l4_umword_t id; id = read_sys_reg(Reg_sys_clcd) & Sys_clcd_idmask; + if (is_vexpress()) + id = Sys_clcd_id84; switch (id) { case Sys_clcd_id84: case Sys_clcd_idmask: - case 0x1000: // (strange?) qemu value, should be 0x100, or did they think BE? printf("Configure 8.4 CLCD\n"); if (use_xga) {