class pah8011 for mbed
pixart_pah8011.cpp@6:d196b612b14a, 2019-01-23 (annotated)
- 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?
User | Revision | Line number | New 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 |