YAHAL
Yet Another Hardware Abstraction Library
Loading...
Searching...
No Matches
cy8c95xxa_drv.h
1/*
2 * cy8c95xxa_drv.h
3 *
4 * Created on: 28.02.2016
5 * Author: Andreas Terstegge
6 */
7
8/*******************************************************
9 CY8C9520A / CY8C9540A / CY8C9560A
10 20-, 40- 60-Bit I/O Expander with EEPROM
11
12 This is a driver for the CY8C95xxA GPIO expander, which
13 has 3 to 8 8-bit ports (0...7), and is accessed via the I2C
14 interface.
15
16 Pin numbers are calculated with:
17 pin = pin_in_port(0...7) + port(0...7) * 8
18
19 Note that not all pins on Port 1 and 2 are available
20 (depens on the chip addressing)!
21
22 02.05.2015 initial version
23
24 (c) 2015 A. Terstegge
25
26 ********************************************************/
27
28#ifndef _CY8C95XXA_DRV_H_
29#define _CY8C95XXA_DRV_H_
30
31#include "gpio_interface.h"
32#include "i2c_interface.h"
33
34namespace CY8C95XXA {
35
36enum pwm_clk {
37 CLK_32KHZ = 0x00, CLK_24MHZ = 0x01,
38 CLK_1_5MHZ = 0x02, CLK_93_75KHZ = 0x03,
39 CLK_93_75KHZ_DIV = 0x04, CLK_PRE_PWM = 0x05 };
40
41enum gpio_cmd {
42 CMD_STORE_CONFIG = 0x01,
43 CMD_RESTORE_FD = 0x02,
44 CMD_RESET = 0x07 };
45
46enum gpio_en {
47 ENABLE_RO = 0x04,
48 ENABLE_EEPROM = 0x02,
49 ENABLE_WD_PIN = 0x01 };
50
51}
52
54
55public:
56 // User interface
58 cy8c95xxa_drv(i2c_interface & hw, uint8_t addr);
59
60 /* Basic GPIO handling */
61 void gpioMode (uint16_t gpio, uint16_t mode);
62 bool gpioRead (uint16_t gpio);
63 void gpioWrite (uint16_t gpio, bool value);
64 void gpioToggle(uint16_t gpio);
65
66 /* Interrupt handling */
67 void gpioAttachIrq (uint16_t gpio,
68 uint16_t mode,
69 function<void()> handler);
70 void gpioDetachIrq (uint16_t gpio);
71 void gpioEnableIrq (uint16_t gpio);
72 void gpioDisableIrq(uint16_t gpio);
73 void handleInterrupt();
74
75 // PWM stuff
76 bool configPWM (uint8_t port, uint8_t pin, CY8C95XXA::pwm_clk clk,
77 uint8_t period,uint8_t width);
78 void setDivider(uint8_t div);
79 void enablePWM (uint16_t gpio);
80 void disablePWM(uint16_t gpio);
81
82 // Config
83 void sendCommand (CY8C95XXA::gpio_cmd cmd);
84 void setEnableReg(CY8C95XXA::gpio_en en);
85
86 virtual ~cy8c95xxa_drv() { }
87
88private:
89 // Reference to HW interface
90 i2c_interface & _i2c;
91 // Storage for current output state
92 uint8_t _output[8];
93 // I2C addr
94 uint8_t _i2c_addr;
95 // mask for pwm channels
96 uint8_t _pwm_mask;
97
98 // interrupt handler functions
99 function<void()> intHandler[8][8];
100 uint16_t intMode[8][8];
101
102 // Register access
104 uint8_t readRegister (uint8_t reg);
105 bool writeRegister(uint8_t reg, uint8_t value,
106 uint8_t mask = 0xff);
107
108};
109
110#endif // _CY8C95XXA_DRV_H_
111