From cff0e6233dd11f7015d9158619347ba32920c988 Mon Sep 17 00:00:00 2001 From: Markinus Date: Sat, 4 Sep 2010 11:07:44 +0200 Subject: [PATCH 1/7] htcleo: add missing multitouch entry in KConfig --- arch/arm/mach-msm/Kconfig | 7 +- arch/arm/mach-msm/board-htcleo-bkl.c | 104 +++++++++++++++++++++++++++ 2 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 arch/arm/mach-msm/board-htcleo-bkl.c diff --git a/arch/arm/mach-msm/Kconfig b/arch/arm/mach-msm/Kconfig index d60dc6d1..e0f5e2e4 100644 --- a/arch/arm/mach-msm/Kconfig +++ b/arch/arm/mach-msm/Kconfig @@ -1075,4 +1075,9 @@ config VERY_EARLY_CONSOLE effect, the driver must support this and the consoles should be initialized in the board file as soon as possible. - +config HTCLEO_ENABLE_MULTI_TOUCH + bool "Support for multitouch" + default y + depends on MACH_HTCLEO + help + Add multitouch support for touchscreen diff --git a/arch/arm/mach-msm/board-htcleo-bkl.c b/arch/arm/mach-msm/board-htcleo-bkl.c new file mode 100644 index 00000000..ed9552fa --- /dev/null +++ b/arch/arm/mach-msm/board-htcleo-bkl.c @@ -0,0 +1,104 @@ +/* linux/arch/arm/mach-msm/board-htcleo-bkl.c + * + * Copyright (c) 2010 Cotulla + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +//#define DEBUG_LCM +#ifdef DEBUG_LCM +#define LCMDBG(fmt, arg...) printk(fmt, ## arg) +#else +#define LCMDBG(fmt, arg...) {} +#endif + + + +extern int microp_set_bkl(uint8_t value); +extern int micorp_onoff_bkl(int enable); + +static struct led_trigger *htcleo_lcd_backlight; + + +void htcleo_brightness_set(struct led_classdev *led_cdev, enum led_brightness val) +{ + led_cdev->brightness = val; + + // set brigtness level via MicroP + LCMDBG("htcleo_brightness_set: %d\n", val); + if (val > 255) val = 255; + if (val < 30) + { + micorp_onoff_bkl(0); + } + else + { + micorp_onoff_bkl(1); + microp_set_bkl((val - 30) / 23); + } +} + +static struct led_classdev htcleo_backlight_led = +{ + .name = "lcd-backlight", + .brightness = LED_FULL, + .brightness_set = htcleo_brightness_set, +}; + + + + +static int htcleo_backlight_probe(struct platform_device *pdev) +{ + int rc; + + led_trigger_register_simple("lcd-backlight-gate", &htcleo_lcd_backlight); + rc = led_classdev_register(&pdev->dev, &htcleo_backlight_led); + if (rc) + LCMDBG("backlight: failure on register led_classdev\n"); + return 0; +} + + +static struct platform_driver htcleo_backlight_driver = +{ + .probe = htcleo_backlight_probe, + .driver = + { + .name = "htcleo-backlight", + .owner = THIS_MODULE, + }, +}; + + +static int __init htcleo_backlight_init(void) +{ + return platform_driver_register(&htcleo_backlight_driver); +} + +module_init(htcleo_backlight_init); + +// END OF FILE From a49a2bde4bd366eb0787425364ab77454e653f84 Mon Sep 17 00:00:00 2001 From: LeTama Date: Sun, 22 Aug 2010 10:46:59 +0200 Subject: [PATCH 2/7] htcleo: fix bug during PPP data usage --- arch/arm/mach-msm/smd_tty.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/arm/mach-msm/smd_tty.c b/arch/arm/mach-msm/smd_tty.c index a51f1729..efd52ed0 100644 --- a/arch/arm/mach-msm/smd_tty.c +++ b/arch/arm/mach-msm/smd_tty.c @@ -149,10 +149,10 @@ static int smd_tty_open(struct tty_struct *tty, struct file *f) info = smd_tty + n; mutex_lock(&smd_tty_lock); - wake_lock_init(&info->wake_lock, WAKE_LOCK_SUSPEND, name); tty->driver_data = info; if (info->open_count++ == 0) { + wake_lock_init(&info->wake_lock, WAKE_LOCK_SUSPEND, name); info->tty = tty; if (info->ch) { smd_kick(info->ch); From 478e27eb7ac44f3e67aefd56085f5da324501f4f Mon Sep 17 00:00:00 2001 From: Markinus Date: Sat, 4 Sep 2010 11:17:45 +0200 Subject: [PATCH 3/7] htcleo: add fix for PPP bug It's a hack, we have to find out why we have to remove the mutexes --- arch/arm/mach-msm/smd_tty.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm/mach-msm/smd_tty.c b/arch/arm/mach-msm/smd_tty.c index efd52ed0..0f23be8c 100644 --- a/arch/arm/mach-msm/smd_tty.c +++ b/arch/arm/mach-msm/smd_tty.c @@ -204,12 +204,12 @@ static int smd_tty_write(struct tty_struct *tty, ** never be able to write more data than there ** is currently space for */ - mutex_lock(&smd_tty_lock); +// mutex_lock(&smd_tty_lock); avail = smd_write_avail(info->ch); if (len > avail) len = avail; ret = smd_write(info->ch, buf, len); - mutex_unlock(&smd_tty_lock); +// mutex_unlock(&smd_tty_lock); return ret; } From 6e301223bc7862ea556bd499c36abe88acef7de3 Mon Sep 17 00:00:00 2001 From: Markinus Date: Sat, 4 Sep 2010 11:29:05 +0200 Subject: [PATCH 4/7] Revert "htcleo: add fix for PPP bug" This reverts commit 478e27eb7ac44f3e67aefd56085f5da324501f4f. --- arch/arm/mach-msm/smd_tty.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arch/arm/mach-msm/smd_tty.c b/arch/arm/mach-msm/smd_tty.c index 0f23be8c..efd52ed0 100644 --- a/arch/arm/mach-msm/smd_tty.c +++ b/arch/arm/mach-msm/smd_tty.c @@ -204,12 +204,12 @@ static int smd_tty_write(struct tty_struct *tty, ** never be able to write more data than there ** is currently space for */ -// mutex_lock(&smd_tty_lock); + mutex_lock(&smd_tty_lock); avail = smd_write_avail(info->ch); if (len > avail) len = avail; ret = smd_write(info->ch, buf, len); -// mutex_unlock(&smd_tty_lock); + mutex_unlock(&smd_tty_lock); return ret; } From cf341f0ddfdc5f03755bd639099b263ac19ee432 Mon Sep 17 00:00:00 2001 From: Markinus Date: Sat, 4 Sep 2010 11:29:51 +0200 Subject: [PATCH 5/7] htcleo: add fix for PPP bug It's a hack, we have to find out why we have to remove the mutexes --- arch/arm/mach-msm/smd_tty.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/arch/arm/mach-msm/smd_tty.c b/arch/arm/mach-msm/smd_tty.c index efd52ed0..1d1802a3 100644 --- a/arch/arm/mach-msm/smd_tty.c +++ b/arch/arm/mach-msm/smd_tty.c @@ -204,13 +204,16 @@ static int smd_tty_write(struct tty_struct *tty, ** never be able to write more data than there ** is currently space for */ +#ifndef CONFIG_MACH_HTCLEO mutex_lock(&smd_tty_lock); +#endif avail = smd_write_avail(info->ch); if (len > avail) len = avail; ret = smd_write(info->ch, buf, len); +#ifndef CONFIG_MACH_HTCLEO mutex_unlock(&smd_tty_lock); - +#endif return ret; } From a56b45eab97118ec89d1cd690e11f160d0a2fc5c Mon Sep 17 00:00:00 2001 From: Markinus Date: Sat, 4 Sep 2010 18:24:14 +0200 Subject: [PATCH 6/7] RTC: fixed 1550 RTC --- drivers/rtc/rtc-msm7x00a.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/rtc/rtc-msm7x00a.c b/drivers/rtc/rtc-msm7x00a.c index 2b448d29..99ad9bf2 100644 --- a/drivers/rtc/rtc-msm7x00a.c +++ b/drivers/rtc/rtc-msm7x00a.c @@ -264,6 +264,7 @@ static struct platform_driver msmrtc_driver = { static int __init msmrtc_init(void) { + pr_info("RTC: Init MSM RTC Clock"); rtcalarm_time = 0; switch(__amss_version) { case 6210: @@ -274,7 +275,7 @@ static int __init msmrtc_init(void) msmrtc_driver.driver.name="rs30000048:0da5b528"; break; case 1550: - msmrtc_driver.driver.name="rs30000048:00010002"; + msmrtc_driver.driver.name="rs30000048:00010000"; break; default: msmrtc_driver.driver.name="rs30000048:00010001"; From 03b806f9a31950e3ef0a625de63e2a072c03f05d Mon Sep 17 00:00:00 2001 From: Markinus Date: Sat, 4 Sep 2010 18:35:22 +0200 Subject: [PATCH 7/7] htcleo: fixed microp function gsensor, proximity and backlight are in seperated files and working --- arch/arm/mach-msm/board-htcleo-proximity.c | 319 ++++++++++++++++++ .../include/mach/board-htcleo-microp.h | 156 +++++++++ 2 files changed, 475 insertions(+) create mode 100644 arch/arm/mach-msm/board-htcleo-proximity.c create mode 100644 arch/arm/mach-msm/include/mach/board-htcleo-microp.h diff --git a/arch/arm/mach-msm/board-htcleo-proximity.c b/arch/arm/mach-msm/board-htcleo-proximity.c new file mode 100644 index 00000000..07bf2988 --- /dev/null +++ b/arch/arm/mach-msm/board-htcleo-proximity.c @@ -0,0 +1,319 @@ +/* arch/arm/mach-msm/board-htcleo-microp.c + * Copyright (C) 2009 HTC Corporation. + * + * This software is licensed under the terms of the GNU General Public + * License version 2, as published by the Free Software Foundation, and + * may be copied, distributed, and modified under those terms. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. +*/ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "board-htcleo.h" + +#define INT_PSENSOR (1<<4) +#define GPO_PROXIMITY 0x3 + +static int misc_opened; + +static void p_sensor_do_work(struct work_struct *w); +static DECLARE_WORK(p_sensor_work, p_sensor_do_work); + +struct wake_lock proximity_wake_lock; + +static struct capella_cm3602_data { + struct input_dev *input_dev; + struct capella_cm3602_platform_data *pdata; + int enabled; + struct workqueue_struct *p_sensor_wq; +} the_data; + +static int report_psensor_data(void) +{ + int ret, ps_data = 0; + uint8_t data[3] = {0, 0, 0}; + pr_info("%s\n", __func__); + + ret = microp_i2c_read(MICROP_I2C_RCMD_GPIO_STATUS, data, 3); + if (ret < 0) + pr_err("%s: read data failed\n", __func__); + else { + ps_data = (data[1] & 0x1) ? 1 : 0; + pr_info("proximity %s\n", ps_data ? "FAR" : "NEAR"); + + /* 0 is close, 1 is far */ + input_report_abs(the_data.input_dev, ABS_DISTANCE, ps_data); + input_sync(the_data.input_dev); + + wake_lock_timeout(&proximity_wake_lock, 2*HZ); + } + + return ret; +} + +static int capella_cm3602_enable(struct capella_cm3602_data *data) +{ + int rc; + pr_info("%s\n", __func__); + if (data->enabled) { + pr_info("%s: already enabled\n", __func__); + return 0; + } + + /* dummy report */ + input_report_abs(data->input_dev, ABS_DISTANCE, -1); + input_sync(data->input_dev); + + rc = microp_gpo_enable(GPO_PROXIMITY); + if (rc < 0) + return -EIO; + + data->enabled = 1; + report_psensor_data(); + + return rc; +} + +static int capella_cm3602_disable(struct capella_cm3602_data *data) +{ + int rc = -EIO; + pr_info("%s\n", __func__); + if (!data->enabled) { + pr_info("%s: already disabled\n", __func__); + return 0; + } + + rc = microp_gpo_disable(GPO_PROXIMITY); + if (rc < 0) + return -EIO; + + data->enabled = 0; + return rc; +} + +static ssize_t capella_cm3602_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + int ret; + + ret = sprintf(buf, "proximity enabled = %d\n", the_data.enabled); + + return ret; +} + +static ssize_t capella_cm3602_store(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t count + ) +{ + ssize_t val; + + val = -1; + sscanf(buf, "%u", &val); + if (val < 0 || val > 1) + return -EINVAL; + + /* Enable capella_cm3602*/ + if (val == 1) + capella_cm3602_enable(&the_data); + + /* Disable capella_cm3602*/ + if (val == 0) + capella_cm3602_disable(&the_data); + + return count; +} + +static DEVICE_ATTR(proximity, 0644, capella_cm3602_show, capella_cm3602_store); + +static int capella_cm3602_open(struct inode *inode, struct file *file) +{ + pr_info("%s\n", __func__); + if (misc_opened) + return -EBUSY; + misc_opened = 1; + return 0; +} + +static int capella_cm3602_release(struct inode *inode, struct file *file) +{ + pr_info("%s\n", __func__); + misc_opened = 0; + return capella_cm3602_disable(&the_data); +} + +static long capella_cm3602_ioctl(struct file *file, + unsigned int cmd, unsigned long arg) +{ + int val; + pr_info("%s cmd %d\n", __func__, _IOC_NR(cmd)); + switch (cmd) { + case CAPELLA_CM3602_IOCTL_ENABLE: + if (get_user(val, (unsigned long __user *)arg)) + return -EFAULT; + if (val) + return capella_cm3602_enable(&the_data); + else + return capella_cm3602_disable(&the_data); + break; + case CAPELLA_CM3602_IOCTL_GET_ENABLED: + return put_user(the_data.enabled, (unsigned long __user *)arg); + break; + default: + pr_err("%s: invalid cmd %d\n", __func__, _IOC_NR(cmd)); + return -EINVAL; + } +} + +static void p_sensor_do_work(struct work_struct *w) +{ + report_psensor_data(); +} + +void p_sensor_irq_handler(void) +{ + pr_info("%s\n", __func__); + queue_work(the_data.p_sensor_wq, &p_sensor_work); +} + + +static struct file_operations capella_cm3602_fops = { + .owner = THIS_MODULE, + .open = capella_cm3602_open, + .release = capella_cm3602_release, + .unlocked_ioctl = capella_cm3602_ioctl +}; + +static struct miscdevice capella_cm3602_misc = { + .minor = MISC_DYNAMIC_MINOR, + .name = "cm3602", + .fops = &capella_cm3602_fops +}; + +static int capella_cm3602_probe(struct platform_device *pdev) +{ + int rc = -1; + struct input_dev *input_dev; + struct capella_cm3602_data *ip; + struct capella_cm3602_platform_data *pdata; + + struct class *proximity_attr_class; + struct device *proximity_attr_dev; + + pr_info("%s: probe\n", __func__); + + pdata = dev_get_platdata(&pdev->dev); + + ip = &the_data; + platform_set_drvdata(pdev, ip); + + input_dev = input_allocate_device(); + if (!input_dev) { + pr_err("%s: could not allocate input device\n", __func__); + rc = -ENOMEM; + goto done; + } + ip->input_dev = input_dev; + ip->pdata = pdata; + input_set_drvdata(input_dev, ip); + + input_dev->name = "proximity"; + + set_bit(EV_ABS, input_dev->evbit); + input_set_abs_params(input_dev, ABS_DISTANCE, 0, 1, 0, 0); + + rc = input_register_device(input_dev); + if (rc < 0) { + pr_err("%s: could not register input device\n", __func__); + goto err_free_input_device; + } + + rc = misc_register(&capella_cm3602_misc); + if (rc < 0) { + pr_err("%s: could not register misc device\n", __func__); + goto err_unregister_input_device; + } + + wake_lock_init(&proximity_wake_lock, WAKE_LOCK_SUSPEND, "proximity"); + + proximity_attr_class = class_create(THIS_MODULE, "sensors"); + if (IS_ERR(proximity_attr_class)) { + pr_err("%s: class_create failed\n", __func__); + rc = PTR_ERR(proximity_attr_class); + proximity_attr_class = NULL; + goto err_create_class; + } + + proximity_attr_dev = device_create(proximity_attr_class, + NULL, 0, "%s", "proximity_sensor"); + if (unlikely(IS_ERR(proximity_attr_dev))) { + pr_err("%s: device create failed\n", __func__); + rc = PTR_ERR(proximity_attr_dev); + proximity_attr_dev = NULL; + goto err_create_proximity_attr_device; + } + + rc = device_create_file(proximity_attr_dev, &dev_attr_proximity); + if (rc) { + pr_err("%s: device_create_file failed\n", __func__); + goto err_create_proximity_device_file; + } + + ip->p_sensor_wq = create_workqueue("p-sensor_microp_wq"); + if (ip->p_sensor_wq == NULL) { + pr_err("%s: create_workqueue failed\n", __func__); + goto err_create_workqueue; + } + + goto done; + + +err_create_workqueue: + device_remove_file(proximity_attr_dev, &dev_attr_proximity); +err_create_proximity_device_file: + device_unregister(proximity_attr_dev); +err_create_proximity_attr_device: + class_destroy(proximity_attr_class); +err_create_class: + misc_deregister(&capella_cm3602_misc); +err_unregister_input_device: + input_unregister_device(input_dev); +err_free_input_device: + input_free_device(input_dev); +done: + return rc; +} + +static struct platform_driver capella_cm3602_driver = { + .probe = capella_cm3602_probe, + .driver = { + .name = "htcleo-proximity", + .owner = THIS_MODULE + }, +}; + +static int __init htcleo_capella_cm3602_init(void) +{ + return platform_driver_register(&capella_cm3602_driver); +} + +device_initcall(htcleo_capella_cm3602_init); diff --git a/arch/arm/mach-msm/include/mach/board-htcleo-microp.h b/arch/arm/mach-msm/include/mach/board-htcleo-microp.h new file mode 100644 index 00000000..5e0b074b --- /dev/null +++ b/arch/arm/mach-msm/include/mach/board-htcleo-microp.h @@ -0,0 +1,156 @@ +/* + * Definitions for BMA150 G-sensor chip. + */ +#ifndef HTCLEO_MICROP_H +#define HTCLEO_MICROP_H + +#include + +static struct wake_lock microp_i2c_wakelock; + +static struct i2c_client *private_microp_client; + +struct microp_i2c_platform_data { + struct platform_device *microp_devices; + int num_devices; + uint32_t gpio_reset; + void *dev_id; + uint8_t microp_mic_status; + uint8_t function_node[20]; + uint32_t cmd_diff; +}; + +struct microp_int_pin { + uint16_t int_gsensor; + uint16_t int_lsensor; + uint16_t int_reset; + uint16_t int_simcard; + uint16_t int_hpin; + uint16_t int_remotekey; +}; + +struct microp_led_data { + int type; + struct led_classdev ldev; + struct mutex led_data_mutex; + struct work_struct brightness_work; + spinlock_t brightness_lock; + enum led_brightness brightness; + uint8_t mode; + uint8_t blink; +}; + +struct microp_i2c_work { + struct work_struct work; + struct i2c_client *client; + int (*intr_debounce)(uint8_t *pin_status); + void (*intr_function)(uint8_t *pin_status); +}; + +enum led_type { + GREEN_LED, + AMBER_LED, + NUM_LEDS, +}; + +struct microp_i2c_client_data { + struct mutex microp_i2c_rw_mutex; + struct mutex proximity_api_lock; + struct microp_led_data leds[NUM_LEDS]; + uint8_t gpio_reset; + uint16_t version; + struct microp_i2c_work work; + struct delayed_work hpin_debounce_work; + struct early_suspend early_suspend; + uint8_t enable_early_suspend; + uint8_t enable_reset_button; + int microp_is_suspend; + int auto_backlight_enabled; + uint8_t proximity_sensor_enabled; + uint8_t button_led_value; + int headset_is_in; + int is_hpin_pin_stable; + struct input_dev *pr_input_dev; + struct input_dev *ls_input_dev; + uint32_t microp_als_kadc; +}; + +#define MICROP_I2C_NAME "htcleo-microp" + +#define MICROP_LSENSOR_ADC_CHAN 6 +#define MICROP_REMOTE_KEY_ADC_CHAN 7 + +#define MICROP_I2C_WCMD_MISC 0x20 +#define MICROP_I2C_WCMD_SPI_EN 0x21 +#define MICROP_I2C_WCMD_LCM_BL_MANU_CTL 0x22 +#define MICROP_I2C_WCMD_AUTO_BL_CTL 0x23 +#define MICROP_I2C_RCMD_SPI_BL_STATUS 0x24 +#define MICROP_I2C_WCMD_LED_PWM 0x25 +#define MICROP_I2C_WCMD_BL_EN 0x26 +#define MICROP_I2C_RCMD_VERSION 0x30 +#define MICROP_I2C_WCMD_ADC_TABLE 0x42 +#define MICROP_I2C_WCMD_LED_CTRL 0x51 +#define MICROP_I2C_WCMD_LED_MODE 0x53 +#define MICROP_I2C_RCMD_GREEN_LED_REMAIN_TIME 0x54 +#define MICROP_I2C_RCMD_AMBER_LED_REMAIN_TIME 0x55 +#define MICROP_I2C_RCMD_LED_REMAIN_TIME 0x56 +#define MICROP_I2C_RCMD_BLUE_LED_REMAIN_TIME 0x57 +#define MICROP_I2C_RCMD_LED_STATUS 0x58 +#define MICROP_I2C_WCMD_JOGBALL_LED_MODE 0x5A +#define MICROP_I2C_WCMD_JOGBALL_LED_PWM_SET 0x5C +#define MICROP_I2C_WCMD_READ_ADC_VALUE_REQ 0x60 +#define MICROP_I2C_RCMD_ADC_VALUE 0x62 +#define MICROP_I2C_WCMD_REMOTEKEY_TABLE 0x63 +#define MICROP_I2C_WCMD_ADC_REQ 0x64 +#define MICROP_I2C_WCMD_LCM_BURST 0x6A +#define MICROP_I2C_WCMD_LCM_BURST_EN 0x6B +#define MICROP_I2C_WCMD_LCM_REGISTER 0x70 +#define MICROP_I2C_WCMD_GSENSOR_REG 0x73 +#define MICROP_I2C_WCMD_GSENSOR_REG_DATA_REQ 0x74 +#define MICROP_I2C_RCMD_GSENSOR_REG_DATA 0x75 +#define MICROP_I2C_WCMD_GSENSOR_DATA_REQ 0x76 +#define MICROP_I2C_RCMD_GSENSOR_X_DATA 0x77 +#define MICROP_I2C_RCMD_GSENSOR_Y_DATA 0x78 +#define MICROP_I2C_RCMD_GSENSOR_Z_DATA 0x79 +#define MICROP_I2C_RCMD_GSENSOR_DATA 0x7A +#define MICROP_I2C_WCMD_OJ_REG 0x7B +#define MICROP_I2C_WCMD_OJ_REG_DATA_REQ 0x7C +#define MICROP_I2C_RCMD_OJ_REG_DATA 0x7D +#define MICROP_I2C_WCMD_OJ_POS_DATA_REQ 0x7E +#define MICROP_I2C_RCMD_OJ_POS_DATA 0x7F +#define MICROP_I2C_WCMD_GPI_INT_CTL_EN 0x80 +#define MICROP_I2C_WCMD_GPI_INT_CTL_DIS 0x81 +#define MICROP_I2C_RCMD_GPI_INT_STATUS 0x82 +#define MICROP_I2C_RCMD_GPIO_STATUS 0x83 +#define MICROP_I2C_WCMD_GPI_INT_STATUS_CLR 0x84 +#define MICROP_I2C_RCMD_GPI_INT_SETTING 0x85 +#define MICROP_I2C_RCMD_REMOTE_KEYCODE 0x87 +#define MICROP_I2C_WCMD_REMOTE_KEY_DEBN_TIME 0x88 +#define MICROP_I2C_WCMD_REMOTE_PLUG_DEBN_TIME 0x89 +#define MICROP_I2C_WCMD_SIMCARD_DEBN_TIME 0x8A +#define MICROP_I2C_WCMD_GPO_LED_STATUS_EN 0x90 +#define MICROP_I2C_WCMD_GPO_LED_STATUS_DIS 0x91 +#define MICROP_I2C_RCMD_GPO_LED_STATUS 0x92 +#define MICROP_I2C_WCMD_OJ_INT_STATUS 0xA8 +#define MICROP_I2C_RCMD_MOBEAM_STATUS 0xB1 +#define MICROP_I2C_WCMD_MOBEAM_DL 0xB2 +#define MICROP_I2C_WCMD_MOBEAM_SEND 0xB3 + + +#define IRQ_GSENSOR (1<<10) +#define IRQ_LSENSOR (1<<9) +#define IRQ_REMOTEKEY (1<<7) +#define IRQ_HEADSETIN (1<<2) +#define IRQ_PROXIMITY (1<<1) +#define IRQ_SDCARD (1<<0) + +#define READ_GPI_STATE_HPIN (1<<2) +#define READ_GPI_STATE_SDCARD (1<<0) + +#define GPO_PROXIMITY 0x3 + +int microp_i2c_read(uint8_t addr, uint8_t *data, int length); +int microp_i2c_write(uint8_t addr, uint8_t *data, int length); +int microp_gpo_enable(uint16_t interrupt_mask); +int microp_gpo_disable(uint16_t interrupt_mask); +#endif