From 86e8c283307d3d884a0d5dba3b50fed0e4ad0914 Mon Sep 17 00:00:00 2001 From: Amaury Pouly Date: Wed, 11 May 2011 22:38:09 +0000 Subject: fuze+: implement Synaptics RMI driver on top of i2c, add touchpad debug screen, bootloader enters debug screen by default Since the bootloader currently always fails at storage point (unimplemented), always enter touchpad debug screen and power off which pressing power button. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@29859 a1c6a512-1295-4272-9138-f99709370657 --- firmware/drivers/synaptics-rmi.c | 77 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 firmware/drivers/synaptics-rmi.c (limited to 'firmware/drivers') diff --git a/firmware/drivers/synaptics-rmi.c b/firmware/drivers/synaptics-rmi.c new file mode 100644 index 0000000000..c6a1bae168 --- /dev/null +++ b/firmware/drivers/synaptics-rmi.c @@ -0,0 +1,77 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2011 by Amaury Pouly + * + * 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 "generic_i2c.h" +#include "synaptics-rmi.h" + +static int rmi_cur_page; +static int rmi_i2c_addr; +static int rmi_i2c_bus; + +/* NOTE: + * RMI over i2c supports some special aliases on page 0x2 but this driver don't + * use them */ + +int rmi_init(int i2c_bus_index, int i2c_dev_addr) +{ + rmi_i2c_bus = i2c_bus_index; + rmi_i2c_addr = i2c_dev_addr; + rmi_cur_page = 0x4; + return 0; +} + +static int rmi_select_page(unsigned char page) +{ + /* Lazy page select */ + if(page != rmi_cur_page) + { + rmi_cur_page = page; + return i2c_write_data(rmi_i2c_bus, rmi_i2c_addr, RMI_PAGE_SELECT, &page, 1); + } + else + return 0; +} + +int rmi_read(int address, int byte_count, unsigned char *buffer) +{ + if(rmi_select_page(address >> 8) < 0) + return -1; + return i2c_read_data(rmi_i2c_bus, rmi_i2c_addr, address & 0xff, buffer, byte_count); +} + +int rmi_read_single(int address) +{ + unsigned char c; + int ret = rmi_read(address, 1, &c); + return ret < 0 ? ret : c; +} + +int rmi_write(int address, int byte_count, const unsigned char *buffer) +{ + if(rmi_select_page(address >> 8) < 0) + return -1; + return i2c_write_data(rmi_i2c_bus, rmi_i2c_addr, address & 0xff, buffer, byte_count); +} + +int rmi_write_single(int address, unsigned char byte) +{ + return rmi_write(address, 1, &byte); +} -- cgit v1.2.3