@@ -45,18 +45,18 @@ static inline struct i2c_s *cy_get_i2c(i2c_t *obj)
4545extern "C" {
4646#endif
4747
48- static uint32_t cy_i2c_convert_event (i2c_t * obj , cyhal_i2c_irq_event_t event )
48+ static uint32_t cy_i2c_convert_event (i2c_t * obj , cyhal_i2c_event_t event )
4949{
50- if (CYHAL_I2C_IRQ_NONE != (event & (CYHAL_I2C_SLAVE_ERR_EVENT | CYHAL_I2C_MASTER_ERR_EVENT ))) {
50+ if (CYHAL_I2C_EVENT_NONE != (event & (CYHAL_I2C_SLAVE_ERR_EVENT | CYHAL_I2C_MASTER_ERR_EVENT ))) {
5151 event |= I2C_EVENT_ERROR ;
5252 }
53- if (CYHAL_I2C_IRQ_NONE != (event & (CYHAL_I2C_SLAVE_RD_CMPLT_EVENT | CYHAL_I2C_SLAVE_WR_CMPLT_EVENT | CYHAL_I2C_MASTER_RD_CMPLT_EVENT | CYHAL_I2C_MASTER_WR_CMPLT_EVENT )) && !i2c_active (obj )) {
53+ if (CYHAL_I2C_EVENT_NONE != (event & (CYHAL_I2C_SLAVE_RD_CMPLT_EVENT | CYHAL_I2C_SLAVE_WR_CMPLT_EVENT | CYHAL_I2C_MASTER_RD_CMPLT_EVENT | CYHAL_I2C_MASTER_WR_CMPLT_EVENT )) && !i2c_active (obj )) {
5454 event |= I2C_EVENT_TRANSFER_COMPLETE ;
5555 }
5656 return event ;
5757}
5858
59- static void cy_i2c_event_handler (void * handler_arg , cyhal_i2c_irq_event_t event )
59+ static void cy_i2c_event_handler (void * handler_arg , cyhal_i2c_event_t event )
6060{
6161 struct i2c_s * i2c = cy_get_i2c ((i2c_t * )handler_arg );
6262 switch (event ) {
@@ -91,7 +91,6 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
9191 // MBED I2C driver currently does not support free, so we will allow I2C to be reallocated.
9292 // TODO: once the the I2C driver properly supports free, this need to be fixed so that clocks and pins are no longer leaked.
9393 cyhal_hwmgr_free (& (i2c -> hal_i2c .resource ));
94- cyhal_hwmgr_set_unconfigured (i2c -> hal_i2c .resource .type , i2c -> hal_i2c .resource .block_num , i2c -> hal_i2c .resource .channel_num );
9594 cyhal_resource_inst_t pin_rsc = cyhal_utils_get_gpio_resource (sda );
9695 cyhal_hwmgr_free (& pin_rsc );
9796 pin_rsc = cyhal_utils_get_gpio_resource (scl );
@@ -105,23 +104,23 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
105104 i2c -> cfg .address = 0 ;
106105 i2c -> cfg .frequencyhal_hz = 400000 ;
107106 i2c -> async_handler = NULL ;
108- cyhal_i2c_register_irq (& (i2c -> hal_i2c ), & cy_i2c_event_handler , obj );
109- cyhal_i2c_irq_enable (& (i2c -> hal_i2c ), (cyhal_i2c_irq_event_t )(CYHAL_I2C_SLAVE_READ_EVENT | CYHAL_I2C_SLAVE_WRITE_EVENT | CYHAL_I2C_SLAVE_ERR_EVENT | CYHAL_I2C_SLAVE_RD_CMPLT_EVENT | CYHAL_I2C_SLAVE_WR_CMPLT_EVENT | CYHAL_I2C_MASTER_ERR_EVENT | CYHAL_I2C_MASTER_RD_CMPLT_EVENT | CYHAL_I2C_MASTER_WR_CMPLT_EVENT ), true);
107+ cyhal_i2c_register_callback (& (i2c -> hal_i2c ), & cy_i2c_event_handler , obj );
108+ cyhal_i2c_enable_event (& (i2c -> hal_i2c ), (cyhal_i2c_event_t )(CYHAL_I2C_SLAVE_READ_EVENT | CYHAL_I2C_SLAVE_WRITE_EVENT | CYHAL_I2C_SLAVE_ERR_EVENT | CYHAL_I2C_SLAVE_RD_CMPLT_EVENT | CYHAL_I2C_SLAVE_WR_CMPLT_EVENT | CYHAL_I2C_MASTER_ERR_EVENT | CYHAL_I2C_MASTER_RD_CMPLT_EVENT | CYHAL_I2C_MASTER_WR_CMPLT_EVENT ), CYHAL_ISR_PRIORITY_DEFAULT , true);
110109}
111110
112111void i2c_frequency (i2c_t * obj , int hz )
113112{
114113 struct i2c_s * i2c = cy_get_i2c (obj );
115114 i2c -> cfg .frequencyhal_hz = (uint32_t )hz ;
116- if (CY_RSLT_SUCCESS != cyhal_i2c_set_config (& (i2c -> hal_i2c ), & (i2c -> cfg ))) {
117- MBED_ERROR (MBED_MAKE_ERROR (MBED_MODULE_DRIVER_I2C , MBED_ERROR_CODE_FAILED_OPERATION ), "cyhal_i2c_set_config " );
115+ if (CY_RSLT_SUCCESS != cyhal_i2c_configure (& (i2c -> hal_i2c ), & (i2c -> cfg ))) {
116+ MBED_ERROR (MBED_MAKE_ERROR (MBED_MODULE_DRIVER_I2C , MBED_ERROR_CODE_FAILED_OPERATION ), "cyhal_i2c_configure " );
118117 }
119118}
120119
121120int i2c_start (i2c_t * obj )
122121{
123- // Not supported ; start/stop is generated by i2c_read/i2c_write
124- return -1 ;
122+ // Nothing to do ; start/stop is generated by i2c_read/i2c_write
123+ return 0 ;
125124}
126125
127126int i2c_stop (i2c_t * obj )
@@ -136,7 +135,7 @@ int i2c_stop(i2c_t *obj)
136135int i2c_read (i2c_t * obj , int address , char * data , int length , int stop )
137136{
138137 struct i2c_s * i2c = cy_get_i2c (obj );
139- if (CY_RSLT_SUCCESS != cyhal_i2c_master_read (& (i2c -> hal_i2c ), address >> 1 , (uint8_t * )data , (uint16_t )length , CY_I2C_DEFAULT_TIMEOUT )) {
138+ if (CY_RSLT_SUCCESS != cyhal_i2c_master_read (& (i2c -> hal_i2c ), address >> 1 , (uint8_t * )data , (uint16_t )length , CY_I2C_DEFAULT_TIMEOUT , ( bool ) stop )) {
140139 return (int )I2C_ERROR_NO_SLAVE ;
141140 }
142141 return length ;
@@ -145,7 +144,7 @@ int i2c_read(i2c_t *obj, int address, char *data, int length, int stop)
145144int i2c_write (i2c_t * obj , int address , const char * data , int length , int stop )
146145{
147146 struct i2c_s * i2c = cy_get_i2c (obj );
148- if (CY_RSLT_SUCCESS != cyhal_i2c_master_write (& (i2c -> hal_i2c ), address >> 1 , (const uint8_t * )data , (uint16_t )length , CY_I2C_DEFAULT_TIMEOUT )) {
147+ if (CY_RSLT_SUCCESS != cyhal_i2c_master_write (& (i2c -> hal_i2c ), address >> 1 , (const uint8_t * )data , (uint16_t )length , CY_I2C_DEFAULT_TIMEOUT , ( bool ) stop )) {
149148 return (int )I2C_ERROR_NO_SLAVE ;
150149 }
151150 // NOTE: HAL does not report how many bytes were actually sent in case of early NAK
@@ -210,8 +209,8 @@ void i2c_slave_mode(i2c_t *obj, int enable_slave)
210209{
211210 struct i2c_s * i2c = cy_get_i2c (obj );
212211 i2c -> cfg .is_slave = (0 != enable_slave );
213- if (CY_RSLT_SUCCESS != cyhal_i2c_set_config (& (i2c -> hal_i2c ), & (i2c -> cfg ))) {
214- MBED_ERROR (MBED_MAKE_ERROR (MBED_MODULE_DRIVER_I2C , MBED_ERROR_CODE_FAILED_OPERATION ), "cyhal_i2c_set_config " );
212+ if (CY_RSLT_SUCCESS != cyhal_i2c_configure (& (i2c -> hal_i2c ), & (i2c -> cfg ))) {
213+ MBED_ERROR (MBED_MAKE_ERROR (MBED_MODULE_DRIVER_I2C , MBED_ERROR_CODE_FAILED_OPERATION ), "cyhal_i2c_configure " );
215214 }
216215}
217216
@@ -242,8 +241,8 @@ void i2c_slave_address(i2c_t *obj, int idx, uint32_t address, uint32_t mask)
242241{
243242 struct i2c_s * i2c = cy_get_i2c (obj );
244243 i2c -> cfg .address = address ;
245- if (CY_RSLT_SUCCESS != cyhal_i2c_set_config (& (i2c -> hal_i2c ), & (i2c -> cfg ))) {
246- MBED_ERROR (MBED_MAKE_ERROR (MBED_MODULE_DRIVER_I2C , MBED_ERROR_CODE_FAILED_OPERATION ), "cyhal_i2c_set_config " );
244+ if (CY_RSLT_SUCCESS != cyhal_i2c_configure (& (i2c -> hal_i2c ), & (i2c -> cfg ))) {
245+ MBED_ERROR (MBED_MAKE_ERROR (MBED_MODULE_DRIVER_I2C , MBED_ERROR_CODE_FAILED_OPERATION ), "cyhal_i2c_configure " );
247246 }
248247 Cy_SCB_I2C_SlaveSetAddressMask (i2c -> hal_i2c .base , (uint8_t )mask );
249248}
0 commit comments