ps2_io.c (1161B)
1 #include <stdbool.h> 2 #include "ps2_io.h" 3 #include "gpio.h" 4 #include "wait.h" 5 6 /* Check port settings for clock and data line */ 7 #if !(defined(PS2_CLOCK_PIN)) 8 # error "PS/2 clock setting is required in config.h" 9 #endif 10 11 #if !(defined(PS2_DATA_PIN)) 12 # error "PS/2 data setting is required in config.h" 13 #endif 14 15 /* 16 * Clock 17 */ 18 void clock_init(void) {} 19 20 void clock_lo(void) { 21 // Transition from input with pull-up to output low via Hi-Z instead of output high 22 gpio_write_pin_low(PS2_CLOCK_PIN); 23 gpio_set_pin_output(PS2_CLOCK_PIN); 24 } 25 26 void clock_hi(void) { 27 gpio_set_pin_input_high(PS2_CLOCK_PIN); 28 } 29 30 bool clock_in(void) { 31 gpio_set_pin_input_high(PS2_CLOCK_PIN); 32 wait_us(1); 33 return gpio_read_pin(PS2_CLOCK_PIN); 34 } 35 36 /* 37 * Data 38 */ 39 void data_init(void) {} 40 41 void data_lo(void) { 42 // Transition from input with pull-up to output low via Hi-Z instead of output high 43 gpio_write_pin_low(PS2_DATA_PIN); 44 gpio_set_pin_output(PS2_DATA_PIN); 45 } 46 47 void data_hi(void) { 48 gpio_set_pin_input_high(PS2_DATA_PIN); 49 } 50 51 bool data_in(void) { 52 gpio_set_pin_input_high(PS2_DATA_PIN); 53 wait_us(1); 54 return gpio_read_pin(PS2_DATA_PIN); 55 }