class pah8011 for mbed

Committer:
bell_huang
Date:
Wed Jan 23 08:01:57 2019 +0000
Revision:
6:d196b612b14a
Parent:
5:37451de228e4
Remove mbed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bell_huang 0:242cf8f28bf2 1 #include "pixart_pah8011.h"
bell_huang 0:242cf8f28bf2 2
bell_huang 5:37451de228e4 3
bell_huang 0:242cf8f28bf2 4 extern "C" {
bell_huang 0:242cf8f28bf2 5
bell_huang 5:37451de228e4 6
bell_huang 6:d196b612b14a 7 #include "pah_comm.h"
bell_huang 0:242cf8f28bf2 8 #include "pah_driver.h"
bell_huang 5:37451de228e4 9 #include "pah_platform_functions.h"
bell_huang 6:d196b612b14a 10 #include <string.h>
bell_huang 5:37451de228e4 11
bell_huang 5:37451de228e4 12
bell_huang 5:37451de228e4 13 void disable_debug_printf(const char *fmt, ...)
bell_huang 0:242cf8f28bf2 14 {
bell_huang 5:37451de228e4 15 // do nothing
bell_huang 0:242cf8f28bf2 16 }
bell_huang 5:37451de228e4 17
bell_huang 6:d196b612b14a 18 DEBUG_PRINT_HANDLE debug_printf = disable_debug_printf;
bell_huang 0:242cf8f28bf2 19
bell_huang 0:242cf8f28bf2 20 void delay_ms(uint64_t ms)
bell_huang 0:242cf8f28bf2 21 {
bell_huang 0:242cf8f28bf2 22 wait_ms(ms);
bell_huang 0:242cf8f28bf2 23 }
bell_huang 0:242cf8f28bf2 24
bell_huang 0:242cf8f28bf2 25 } // extern "C"
bell_huang 0:242cf8f28bf2 26
bell_huang 0:242cf8f28bf2 27
bell_huang 0:242cf8f28bf2 28 namespace pixart {
bell_huang 0:242cf8f28bf2 29
bell_huang 0:242cf8f28bf2 30
bell_huang 6:d196b612b14a 31 static pah_ret mbed_i2c_write(struct pah_drv_comm_s *comm, uint8_t addr, uint8_t data)
bell_huang 6:d196b612b14a 32 {
bell_huang 6:d196b612b14a 33 pah8011 *pah8011_state = (pah8011*)comm->user_data;
bell_huang 6:d196b612b14a 34 I2C *i2c = pah8011_state->get_i2c();
bell_huang 6:d196b612b14a 35 int rc = 0;
bell_huang 6:d196b612b14a 36 char data_write[2];
bell_huang 6:d196b612b14a 37
bell_huang 6:d196b612b14a 38 data_write[0] = addr;
bell_huang 6:d196b612b14a 39 data_write[1] = data;
bell_huang 6:d196b612b14a 40
bell_huang 6:d196b612b14a 41 rc = i2c->write((pah8011_state->get_i2c_slave_id() << 1), data_write, 2, 0);
bell_huang 6:d196b612b14a 42 if (rc != 0)
bell_huang 6:d196b612b14a 43 return PAH_RET_PLAT_FAILED;
bell_huang 6:d196b612b14a 44
bell_huang 6:d196b612b14a 45 return PAH_RET_SUCCESS;
bell_huang 6:d196b612b14a 46 }
bell_huang 6:d196b612b14a 47
bell_huang 6:d196b612b14a 48 static pah_ret mbed_i2c_burst_read(struct pah_drv_comm_s *comm, uint8_t addr, uint8_t *data, uint32_t rx_size)
bell_huang 6:d196b612b14a 49 {
bell_huang 6:d196b612b14a 50 pah8011 *pah8011_state = (pah8011*)comm->user_data;
bell_huang 6:d196b612b14a 51 I2C *i2c = pah8011_state->get_i2c();
bell_huang 6:d196b612b14a 52 int rc = 0;
bell_huang 6:d196b612b14a 53
bell_huang 6:d196b612b14a 54 rc = i2c->write((pah8011_state->get_i2c_slave_id() << 1), (const char*)&addr, 1, 1);
bell_huang 6:d196b612b14a 55 if (rc != 0)
bell_huang 6:d196b612b14a 56 return PAH_RET_PLAT_FAILED;
bell_huang 6:d196b612b14a 57
bell_huang 6:d196b612b14a 58 rc = i2c->read((pah8011_state->get_i2c_slave_id() << 1), (char*)data, rx_size, 0);
bell_huang 6:d196b612b14a 59 if (rc != 0)
bell_huang 6:d196b612b14a 60 return PAH_RET_PLAT_FAILED;
bell_huang 6:d196b612b14a 61
bell_huang 6:d196b612b14a 62 return PAH_RET_SUCCESS;
bell_huang 6:d196b612b14a 63 }
bell_huang 6:d196b612b14a 64
bell_huang 6:d196b612b14a 65 static pah_ret mbed_i2c_read(struct pah_drv_comm_s *comm, uint8_t addr, uint8_t *data)
bell_huang 6:d196b612b14a 66 {
bell_huang 6:d196b612b14a 67 return mbed_i2c_burst_read(comm, addr, data, 1);
bell_huang 6:d196b612b14a 68 }
bell_huang 6:d196b612b14a 69
bell_huang 6:d196b612b14a 70 static pah_ret mbed_spi_write(struct pah_drv_comm_s *comm, uint8_t addr, uint8_t data)
bell_huang 6:d196b612b14a 71 {
bell_huang 6:d196b612b14a 72 pah8011 *pah8011_state = (pah8011*)comm->user_data;
bell_huang 6:d196b612b14a 73 SPI *spi = pah8011_state->get_spi();
bell_huang 6:d196b612b14a 74 DigitalOut *spi_cs = pah8011_state->get_spi_cs();
bell_huang 6:d196b612b14a 75
bell_huang 6:d196b612b14a 76 *spi_cs = 1;
bell_huang 6:d196b612b14a 77
bell_huang 6:d196b612b14a 78 char data_write[2];
bell_huang 6:d196b612b14a 79 data_write[0] = addr;
bell_huang 6:d196b612b14a 80 data_write[1] = data;
bell_huang 6:d196b612b14a 81
bell_huang 6:d196b612b14a 82 spi->write(data_write, 2, NULL, 0);
bell_huang 6:d196b612b14a 83
bell_huang 6:d196b612b14a 84 *spi_cs = 0;
bell_huang 6:d196b612b14a 85 return PAH_RET_SUCCESS;
bell_huang 6:d196b612b14a 86 }
bell_huang 6:d196b612b14a 87
bell_huang 6:d196b612b14a 88 static pah_ret mbed_spi_burst_read(struct pah_drv_comm_s *comm, uint8_t addr, uint8_t *data, uint32_t rx_size)
bell_huang 6:d196b612b14a 89 {
bell_huang 6:d196b612b14a 90 pah8011 *pah8011_state = (pah8011*)comm->user_data;
bell_huang 6:d196b612b14a 91 SPI *spi = pah8011_state->get_spi();
bell_huang 6:d196b612b14a 92 DigitalOut *spi_cs = pah8011_state->get_spi_cs();
bell_huang 6:d196b612b14a 93
bell_huang 6:d196b612b14a 94 *spi_cs = 1;
bell_huang 6:d196b612b14a 95 /*
bell_huang 6:d196b612b14a 96 spi->write(addr);
bell_huang 6:d196b612b14a 97
bell_huang 6:d196b612b14a 98 for (uint32_t i = 0; i < rx_size; ++i)
bell_huang 6:d196b612b14a 99 data[i] = spi->write(0x00);
bell_huang 6:d196b612b14a 100 */
bell_huang 6:d196b612b14a 101
bell_huang 6:d196b612b14a 102 static char buf[256];
bell_huang 6:d196b612b14a 103 buf[0] = addr;
bell_huang 6:d196b612b14a 104
bell_huang 6:d196b612b14a 105 static const uint8_t WRITE_LENGTH = 1;
bell_huang 6:d196b612b14a 106 spi->write(buf, WRITE_LENGTH, buf, WRITE_LENGTH + rx_size);
bell_huang 6:d196b612b14a 107
bell_huang 6:d196b612b14a 108 memcpy(data, &buf[WRITE_LENGTH], rx_size);
bell_huang 6:d196b612b14a 109
bell_huang 6:d196b612b14a 110 *spi_cs = 0;
bell_huang 6:d196b612b14a 111 return PAH_RET_SUCCESS;
bell_huang 6:d196b612b14a 112 }
bell_huang 6:d196b612b14a 113
bell_huang 6:d196b612b14a 114 static pah_ret mbed_spi_read(struct pah_drv_comm_s *comm, uint8_t addr, uint8_t *data)
bell_huang 6:d196b612b14a 115 {
bell_huang 6:d196b612b14a 116 return mbed_spi_burst_read(comm, addr, data, 1);
bell_huang 6:d196b612b14a 117 }
bell_huang 6:d196b612b14a 118
bell_huang 6:d196b612b14a 119
bell_huang 6:d196b612b14a 120 pah8011::pah8011(I2C &i2c, uint8_t slave_id)
bell_huang 6:d196b612b14a 121 : m_i2c(&i2c)
bell_huang 6:d196b612b14a 122 , m_i2c_slave_id(slave_id)
bell_huang 6:d196b612b14a 123 , m_spi(NULL)
bell_huang 6:d196b612b14a 124 , m_spi_cs(NULL)
bell_huang 6:d196b612b14a 125 , m_is_ppg_enabled(false)
bell_huang 0:242cf8f28bf2 126 , m_is_touch_enabled(false)
bell_huang 0:242cf8f28bf2 127 {
bell_huang 6:d196b612b14a 128 pah_drv_comm_s pah_drv_comm = {
bell_huang 6:d196b612b14a 129 .type = pah_drv_comm_i2c,
bell_huang 6:d196b612b14a 130 .user_data = this,
bell_huang 6:d196b612b14a 131 .max_length = 256,
bell_huang 6:d196b612b14a 132 .write = mbed_i2c_write,
bell_huang 6:d196b612b14a 133 .write_delay = NULL,
bell_huang 6:d196b612b14a 134 .read = mbed_i2c_read,
bell_huang 6:d196b612b14a 135 .burst_read = mbed_i2c_burst_read,
bell_huang 6:d196b612b14a 136 };
bell_huang 6:d196b612b14a 137 pah_comm_set_drv_comm(&pah_drv_comm);
bell_huang 6:d196b612b14a 138 }
bell_huang 6:d196b612b14a 139
bell_huang 6:d196b612b14a 140 pah8011::pah8011(SPI &spi, DigitalOut &cs)
bell_huang 6:d196b612b14a 141 : m_i2c(NULL)
bell_huang 6:d196b612b14a 142 , m_i2c_slave_id(0x15)
bell_huang 6:d196b612b14a 143 , m_spi(&spi)
bell_huang 6:d196b612b14a 144 , m_spi_cs(&cs)
bell_huang 6:d196b612b14a 145 , m_is_ppg_enabled(false)
bell_huang 6:d196b612b14a 146 , m_is_touch_enabled(false)
bell_huang 6:d196b612b14a 147 {
bell_huang 6:d196b612b14a 148 m_spi->format(8, 3);
bell_huang 6:d196b612b14a 149
bell_huang 6:d196b612b14a 150 pah_drv_comm_s pah_drv_comm = {
bell_huang 6:d196b612b14a 151 .type = pah_drv_comm_spi,
bell_huang 6:d196b612b14a 152 .user_data = this,
bell_huang 6:d196b612b14a 153 .max_length = 256,
bell_huang 6:d196b612b14a 154 .write = mbed_spi_write,
bell_huang 6:d196b612b14a 155 .write_delay = NULL,
bell_huang 6:d196b612b14a 156 .read = mbed_spi_read,
bell_huang 6:d196b612b14a 157 .burst_read = mbed_spi_burst_read,
bell_huang 6:d196b612b14a 158 };
bell_huang 6:d196b612b14a 159 pah_comm_set_drv_comm(&pah_drv_comm);
bell_huang 6:d196b612b14a 160 }
bell_huang 0:242cf8f28bf2 161
bell_huang 0:242cf8f28bf2 162 pah8011::~pah8011()
bell_huang 0:242cf8f28bf2 163 {
bell_huang 0:242cf8f28bf2 164 pah_deinit();
bell_huang 0:242cf8f28bf2 165 }
bell_huang 0:242cf8f28bf2 166
bell_huang 5:37451de228e4 167 void pah8011::enable_debug_print(DEBUG_PRINT_HANDLE handler)
bell_huang 5:37451de228e4 168 {
bell_huang 5:37451de228e4 169 if (handler)
bell_huang 5:37451de228e4 170 debug_printf = handler;
bell_huang 5:37451de228e4 171 else
bell_huang 5:37451de228e4 172 debug_printf = disable_debug_printf;
bell_huang 5:37451de228e4 173 }
bell_huang 5:37451de228e4 174
bell_huang 6:d196b612b14a 175 bool pah8011::init()
bell_huang 0:242cf8f28bf2 176 {
bell_huang 0:242cf8f28bf2 177 pah_flags_s flags;
bell_huang 0:242cf8f28bf2 178 memset(&flags, 0, sizeof(flags));
bell_huang 0:242cf8f28bf2 179
bell_huang 0:242cf8f28bf2 180 flags.intshape_pulse_type = pah_intshape_pulse_type_level;
bell_huang 0:242cf8f28bf2 181
bell_huang 0:242cf8f28bf2 182 if (!pah_init_with_flags(&flags))
bell_huang 0:242cf8f28bf2 183 return false;
bell_huang 0:242cf8f28bf2 184
bell_huang 0:242cf8f28bf2 185 return true;
bell_huang 0:242cf8f28bf2 186 }
bell_huang 0:242cf8f28bf2 187
bell_huang 0:242cf8f28bf2 188 bool pah8011::enable_ppg()
bell_huang 0:242cf8f28bf2 189 {
bell_huang 0:242cf8f28bf2 190 m_is_ppg_enabled = true;
bell_huang 0:242cf8f28bf2 191
bell_huang 0:242cf8f28bf2 192 return select_mode();
bell_huang 0:242cf8f28bf2 193 }
bell_huang 0:242cf8f28bf2 194
bell_huang 0:242cf8f28bf2 195 bool pah8011::disable_ppg()
bell_huang 0:242cf8f28bf2 196 {
bell_huang 0:242cf8f28bf2 197 m_is_ppg_enabled = false;
bell_huang 0:242cf8f28bf2 198
bell_huang 0:242cf8f28bf2 199 return select_mode();
bell_huang 0:242cf8f28bf2 200 }
bell_huang 0:242cf8f28bf2 201
bell_huang 0:242cf8f28bf2 202 bool pah8011::enable_touch()
bell_huang 0:242cf8f28bf2 203 {
bell_huang 0:242cf8f28bf2 204 m_is_touch_enabled = true;
bell_huang 0:242cf8f28bf2 205
bell_huang 0:242cf8f28bf2 206 return select_mode();
bell_huang 0:242cf8f28bf2 207 }
bell_huang 0:242cf8f28bf2 208
bell_huang 0:242cf8f28bf2 209 bool pah8011::disable_touch()
bell_huang 0:242cf8f28bf2 210 {
bell_huang 0:242cf8f28bf2 211 m_is_touch_enabled = false;
bell_huang 0:242cf8f28bf2 212
bell_huang 0:242cf8f28bf2 213 return select_mode();
bell_huang 0:242cf8f28bf2 214 }
bell_huang 0:242cf8f28bf2 215
bell_huang 0:242cf8f28bf2 216 bool pah8011::task()
bell_huang 0:242cf8f28bf2 217 {
bell_huang 0:242cf8f28bf2 218 pah_ret ret = pah_task();
bell_huang 0:242cf8f28bf2 219
bell_huang 0:242cf8f28bf2 220 return ret == pah_success
bell_huang 0:242cf8f28bf2 221 || ret == pah_no_interrupt;
bell_huang 0:242cf8f28bf2 222 }
bell_huang 0:242cf8f28bf2 223
bell_huang 0:242cf8f28bf2 224 bool pah8011::get_result(task_result &result)
bell_huang 0:242cf8f28bf2 225 {
bell_huang 0:242cf8f28bf2 226 if (!pah_has_fifo_data())
bell_huang 0:242cf8f28bf2 227 return false;
bell_huang 0:242cf8f28bf2 228
bell_huang 4:cbc49829af39 229 result.data = (int32_t*)pah_get_fifo_data();
bell_huang 0:242cf8f28bf2 230 result.num_per_ch = pah_fifo_data_num_per_ch();
bell_huang 0:242cf8f28bf2 231 result.ch_num = pah_get_fifo_ch_num();
bell_huang 0:242cf8f28bf2 232 result.is_touched = pah_is_touched();
bell_huang 0:242cf8f28bf2 233
bell_huang 0:242cf8f28bf2 234 return true;
bell_huang 0:242cf8f28bf2 235 }
bell_huang 6:d196b612b14a 236
bell_huang 6:d196b612b14a 237 I2C* pah8011::get_i2c() const
bell_huang 6:d196b612b14a 238 {
bell_huang 6:d196b612b14a 239 return m_i2c;
bell_huang 6:d196b612b14a 240 }
bell_huang 6:d196b612b14a 241 uint8_t pah8011::get_i2c_slave_id() const
bell_huang 6:d196b612b14a 242 {
bell_huang 6:d196b612b14a 243 return m_i2c_slave_id;
bell_huang 6:d196b612b14a 244 }
bell_huang 6:d196b612b14a 245 SPI* pah8011::get_spi() const
bell_huang 6:d196b612b14a 246 {
bell_huang 6:d196b612b14a 247 return m_spi;
bell_huang 6:d196b612b14a 248 }
bell_huang 6:d196b612b14a 249 DigitalOut* pah8011::get_spi_cs() const
bell_huang 6:d196b612b14a 250 {
bell_huang 6:d196b612b14a 251 return m_spi_cs;
bell_huang 6:d196b612b14a 252 }
bell_huang 0:242cf8f28bf2 253
bell_huang 0:242cf8f28bf2 254 bool pah8011::select_mode()
bell_huang 0:242cf8f28bf2 255 {
bell_huang 0:242cf8f28bf2 256 pah_mode mode = pah_stop_mode;
bell_huang 0:242cf8f28bf2 257
bell_huang 0:242cf8f28bf2 258 if (m_is_ppg_enabled)
bell_huang 0:242cf8f28bf2 259 {
bell_huang 0:242cf8f28bf2 260 if (m_is_touch_enabled)
bell_huang 0:242cf8f28bf2 261 mode = pah_ppg_touch_mode;
bell_huang 0:242cf8f28bf2 262 else
bell_huang 0:242cf8f28bf2 263 mode = pah_ppg_mode;
bell_huang 0:242cf8f28bf2 264 }
bell_huang 0:242cf8f28bf2 265 else if (m_is_touch_enabled)
bell_huang 0:242cf8f28bf2 266 {
bell_huang 0:242cf8f28bf2 267 mode = pah_touch_mode;
bell_huang 0:242cf8f28bf2 268 }
bell_huang 0:242cf8f28bf2 269 else
bell_huang 0:242cf8f28bf2 270 {
bell_huang 0:242cf8f28bf2 271 mode = pah_stop_mode;
bell_huang 0:242cf8f28bf2 272 }
bell_huang 0:242cf8f28bf2 273
bell_huang 0:242cf8f28bf2 274 return pah_enter_mode(mode);
bell_huang 0:242cf8f28bf2 275 }
bell_huang 0:242cf8f28bf2 276
bell_huang 0:242cf8f28bf2 277 }
bell_huang 0:242cf8f28bf2 278