re-organize and clean-up
This commit is contained in:
parent
b56645808c
commit
040eaa0443
@ -48,103 +48,16 @@
|
|||||||
#define ERROR_TX_RTS 0x1000
|
#define ERROR_TX_RTS 0x1000
|
||||||
#define ERROR_TX_NORESP 0x2000
|
#define ERROR_TX_NORESP 0x2000
|
||||||
|
|
||||||
static void IRAM_ATTR ps2_interrupt_handler(void *self_in);
|
void ps2_reset(void) {
|
||||||
|
gpio_uninstall_isr_service();
|
||||||
static void ps2_set_config(ps2io_ps2_obj_t* self) {
|
|
||||||
// turn on falling edge interrupt
|
|
||||||
gpio_set_intr_type(self->clk_pin, GPIO_INTR_NEGEDGE);
|
|
||||||
gpio_install_isr_service(ESP_INTR_FLAG_IRAM);
|
|
||||||
gpio_isr_handler_add(self->clk_pin, ps2_interrupt_handler, (void*)self);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void disable_interrupt(ps2io_ps2_obj_t* self) {
|
|
||||||
// turn off fallling edge interrupt
|
|
||||||
gpio_isr_handler_remove(self->clk_pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void resume_interrupt(ps2io_ps2_obj_t* self) {
|
|
||||||
self->state = STATE_IDLE;
|
|
||||||
gpio_isr_handler_add(self->clk_pin, ps2_interrupt_handler, (void*)self);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void clk_hi(ps2io_ps2_obj_t* self) {
|
|
||||||
// external pull-up
|
|
||||||
gpio_set_direction(self->clk_pin, GPIO_MODE_INPUT);
|
|
||||||
gpio_pullup_dis(self->clk_pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool wait_clk_lo(ps2io_ps2_obj_t* self, uint32_t us) {
|
|
||||||
clk_hi(self);
|
|
||||||
common_hal_mcu_delay_us(1);
|
|
||||||
while (gpio_get_level(self->clk_pin) && us) {
|
|
||||||
--us;
|
|
||||||
common_hal_mcu_delay_us(1);
|
|
||||||
}
|
|
||||||
return us;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool wait_clk_hi(ps2io_ps2_obj_t* self, uint32_t us) {
|
|
||||||
clk_hi(self);
|
|
||||||
common_hal_mcu_delay_us(1);
|
|
||||||
while (!gpio_get_level(self->clk_pin) && us) {
|
|
||||||
--us;
|
|
||||||
common_hal_mcu_delay_us(1);
|
|
||||||
}
|
|
||||||
return us;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void clk_lo(ps2io_ps2_obj_t* self) {
|
|
||||||
gpio_pullup_dis(self->clk_pin);
|
|
||||||
gpio_set_direction(self->clk_pin, GPIO_MODE_OUTPUT);
|
|
||||||
gpio_set_level(self->clk_pin, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void data_hi(ps2io_ps2_obj_t* self) {
|
|
||||||
// external pull-up
|
|
||||||
gpio_set_direction(self->data_pin, GPIO_MODE_INPUT);
|
|
||||||
gpio_pullup_dis(self->data_pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool wait_data_lo(ps2io_ps2_obj_t* self, uint32_t us) {
|
|
||||||
data_hi(self);
|
|
||||||
common_hal_mcu_delay_us(1);
|
|
||||||
while (gpio_get_level(self->data_pin) && us) {
|
|
||||||
--us;
|
|
||||||
common_hal_mcu_delay_us(1);
|
|
||||||
}
|
|
||||||
return us;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool wait_data_hi(ps2io_ps2_obj_t* self, uint32_t us) {
|
|
||||||
data_hi(self);
|
|
||||||
common_hal_mcu_delay_us(1);
|
|
||||||
while (!gpio_get_level(self->data_pin) && us) {
|
|
||||||
--us;
|
|
||||||
common_hal_mcu_delay_us(1);
|
|
||||||
}
|
|
||||||
return us;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void data_lo(ps2io_ps2_obj_t* self) {
|
|
||||||
gpio_pullup_dis(self->data_pin);
|
|
||||||
gpio_set_direction(self->data_pin, GPIO_MODE_OUTPUT);
|
|
||||||
gpio_set_level(self->data_pin, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void idle(ps2io_ps2_obj_t* self) {
|
|
||||||
clk_hi(self);
|
|
||||||
data_hi(self);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void inhibit(ps2io_ps2_obj_t* self) {
|
|
||||||
clk_lo(self);
|
|
||||||
data_hi(self);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void delay_us(uint32_t t) {
|
static void delay_us(uint32_t t) {
|
||||||
common_hal_mcu_delay_us(t);
|
common_hal_mcu_delay_us(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* interrupt handling */
|
||||||
|
|
||||||
static void IRAM_ATTR ps2_interrupt_handler(void *self_in) {
|
static void IRAM_ATTR ps2_interrupt_handler(void *self_in) {
|
||||||
// Grab the current time first.
|
// Grab the current time first.
|
||||||
uint64_t current_tick = port_get_raw_ticks(NULL);
|
uint64_t current_tick = port_get_raw_ticks(NULL);
|
||||||
@ -222,11 +135,99 @@ static void IRAM_ATTR ps2_interrupt_handler(void *self_in) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void common_hal_ps2io_ps2_construct(ps2io_ps2_obj_t* self,
|
static void enable_interrupt(ps2io_ps2_obj_t* self) {
|
||||||
const mcu_pin_obj_t* data_pin, const mcu_pin_obj_t* clk_pin) {
|
// turn on falling edge interrupt
|
||||||
|
gpio_install_isr_service(ESP_INTR_FLAG_IRAM);
|
||||||
|
gpio_set_intr_type(self->clk_pin, GPIO_INTR_NEGEDGE);
|
||||||
|
gpio_isr_handler_add(self->clk_pin, ps2_interrupt_handler, (void*)self);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void disable_interrupt(ps2io_ps2_obj_t* self) {
|
||||||
|
// turn off fallling edge interrupt
|
||||||
|
gpio_isr_handler_remove(self->clk_pin);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void resume_interrupt(ps2io_ps2_obj_t* self) {
|
||||||
|
self->state = STATE_IDLE;
|
||||||
|
gpio_isr_handler_add(self->clk_pin, ps2_interrupt_handler, (void*)self);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* gpio handling */
|
||||||
|
|
||||||
|
static void clk_hi(ps2io_ps2_obj_t* self) {
|
||||||
|
// external pull-up
|
||||||
|
gpio_set_direction(self->clk_pin, GPIO_MODE_INPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool wait_clk_lo(ps2io_ps2_obj_t* self, uint32_t us) {
|
||||||
|
clk_hi(self);
|
||||||
|
delay_us(1);
|
||||||
|
while (gpio_get_level(self->clk_pin) && us) {
|
||||||
|
--us;
|
||||||
|
delay_us(1);
|
||||||
|
}
|
||||||
|
return us;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool wait_clk_hi(ps2io_ps2_obj_t* self, uint32_t us) {
|
||||||
|
clk_hi(self);
|
||||||
|
delay_us(1);
|
||||||
|
while (!gpio_get_level(self->clk_pin) && us) {
|
||||||
|
--us;
|
||||||
|
delay_us(1);
|
||||||
|
}
|
||||||
|
return us;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void clk_lo(ps2io_ps2_obj_t* self) {
|
||||||
|
gpio_set_direction(self->clk_pin, GPIO_MODE_OUTPUT);
|
||||||
|
gpio_set_level(self->clk_pin, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void data_hi(ps2io_ps2_obj_t* self) {
|
||||||
|
// external pull-up
|
||||||
|
gpio_set_direction(self->data_pin, GPIO_MODE_INPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool wait_data_lo(ps2io_ps2_obj_t* self, uint32_t us) {
|
||||||
|
data_hi(self);
|
||||||
|
delay_us(1);
|
||||||
|
while (gpio_get_level(self->data_pin) && us) {
|
||||||
|
--us;
|
||||||
|
delay_us(1);
|
||||||
|
}
|
||||||
|
return us;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool wait_data_hi(ps2io_ps2_obj_t* self, uint32_t us) {
|
||||||
|
data_hi(self);
|
||||||
|
delay_us(1);
|
||||||
|
while (!gpio_get_level(self->data_pin) && us) {
|
||||||
|
--us;
|
||||||
|
delay_us(1);
|
||||||
|
}
|
||||||
|
return us;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void data_lo(ps2io_ps2_obj_t* self) {
|
||||||
|
gpio_set_direction(self->data_pin, GPIO_MODE_OUTPUT);
|
||||||
|
gpio_set_level(self->data_pin, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void idle(ps2io_ps2_obj_t* self) {
|
||||||
clk_hi(self);
|
clk_hi(self);
|
||||||
data_hi(self);
|
data_hi(self);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void inhibit(ps2io_ps2_obj_t* self) {
|
||||||
|
clk_lo(self);
|
||||||
|
data_hi(self);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ps2io module functions */
|
||||||
|
|
||||||
|
void common_hal_ps2io_ps2_construct(ps2io_ps2_obj_t* self,
|
||||||
|
const mcu_pin_obj_t* data_pin, const mcu_pin_obj_t* clk_pin) {
|
||||||
self->clk_pin = (gpio_num_t)clk_pin->number;
|
self->clk_pin = (gpio_num_t)clk_pin->number;
|
||||||
self->data_pin = (gpio_num_t)data_pin->number;
|
self->data_pin = (gpio_num_t)data_pin->number;
|
||||||
self->state = STATE_IDLE;
|
self->state = STATE_IDLE;
|
||||||
@ -235,11 +236,11 @@ void common_hal_ps2io_ps2_construct(ps2io_ps2_obj_t* self,
|
|||||||
self->bufposw = 0;
|
self->bufposw = 0;
|
||||||
self->waiting_cmd_response = false;
|
self->waiting_cmd_response = false;
|
||||||
|
|
||||||
|
idle(self);
|
||||||
|
enable_interrupt(self);
|
||||||
|
|
||||||
claim_pin(clk_pin);
|
claim_pin(clk_pin);
|
||||||
claim_pin(data_pin);
|
claim_pin(data_pin);
|
||||||
|
|
||||||
// set config will enable the interrupt.
|
|
||||||
ps2_set_config(self);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool common_hal_ps2io_ps2_deinited(ps2io_ps2_obj_t* self) {
|
bool common_hal_ps2io_ps2_deinited(ps2io_ps2_obj_t* self) {
|
||||||
@ -257,10 +258,6 @@ void common_hal_ps2io_ps2_deinit(ps2io_ps2_obj_t* self) {
|
|||||||
self->data_pin = GPIO_NUM_MAX;
|
self->data_pin = GPIO_NUM_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ps2_reset(void) {
|
|
||||||
gpio_uninstall_isr_service();
|
|
||||||
}
|
|
||||||
|
|
||||||
uint16_t common_hal_ps2io_ps2_get_len(ps2io_ps2_obj_t* self) {
|
uint16_t common_hal_ps2io_ps2_get_len(ps2io_ps2_obj_t* self) {
|
||||||
return self->bufcount;
|
return self->bufcount;
|
||||||
}
|
}
|
||||||
@ -291,6 +288,8 @@ uint16_t common_hal_ps2io_ps2_clear_errors(ps2io_ps2_obj_t* self) {
|
|||||||
|
|
||||||
int16_t common_hal_ps2io_ps2_sendcmd(ps2io_ps2_obj_t* self, uint8_t b) {
|
int16_t common_hal_ps2io_ps2_sendcmd(ps2io_ps2_obj_t* self, uint8_t b) {
|
||||||
disable_interrupt(self);
|
disable_interrupt(self);
|
||||||
|
|
||||||
|
/* terminate a transmission if we have */
|
||||||
inhibit(self);
|
inhibit(self);
|
||||||
delay_us(100);
|
delay_us(100);
|
||||||
|
|
||||||
@ -321,6 +320,7 @@ int16_t common_hal_ps2io_ps2_sendcmd(ps2io_ps2_obj_t* self, uint8_t b) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Parity bit */
|
||||||
delay_us(15);
|
delay_us(15);
|
||||||
if (parity) {
|
if (parity) {
|
||||||
data_hi(self);
|
data_hi(self);
|
||||||
|
Loading…
Reference in New Issue
Block a user