qmk_firmware

QMK firmware for my keyboards (Corne, Sweep Ferris) and trackball (Ploopy Adept)
Log | Files | Refs | Submodules | LICENSE

left.c (2055B)


      1 #include "action.h"
      2 #include "left.h"
      3 #include "print.h"
      4 #include "wait.h"
      5 
      6 bool i2c_initialized = false;
      7 
      8 void left_config(void);
      9 i2c_status_t left_write(uint8_t reg, uint8_t data);
     10 i2c_status_t left_read(uint8_t reg, uint8_t *data);
     11 
     12 uint8_t init_mcp23017(void)
     13 {
     14     i2c_initialized = false;
     15 
     16     if (i2c_initialized == 0)
     17     {
     18         i2c_init();  // on pins D(1,0)
     19         _delay_ms(1000);
     20     }
     21 
     22     return 0;
     23 }
     24 void left_init(void)
     25 {
     26     init_mcp23017();
     27     left_scan();
     28 #if 0
     29     while (1)
     30     {
     31         print("wait\n");
     32         wait_us(1000000);
     33     }
     34 #endif
     35 }
     36 
     37 void left_scan(void)
     38 {
     39     
     40     i2c_status_t ret = i2c_ping_address(I2C_ADDR, HOTDOX_I2C_TIMEOUT);
     41 
     42     if (ret == I2C_STATUS_SUCCESS)
     43     {
     44         if (!i2c_initialized)
     45         {
     46             i2c_initialized = true;
     47             left_config();
     48             clear_keyboard();
     49             print("mcp23017 attached!!!\n");
     50         }
     51     }
     52     else
     53     {
     54         if (i2c_initialized)
     55         {
     56             i2c_initialized = false;
     57             clear_keyboard();
     58             print("mcp23017 deattached!!!\n");
     59         }
     60     }
     61 
     62     return;
     63 }
     64 
     65 uint8_t left_read_cols(void)
     66 {
     67     uint8_t data = 0;
     68 
     69     left_read(MCP23017_B0_GPIOA, &data);
     70 
     71     return data;
     72 }
     73 
     74 void left_unselect_rows(void)
     75 {
     76     left_write(MCP23017_B0_IODIRB, 0x3F);
     77 }
     78 
     79 void left_select_row(uint8_t row)
     80 {
     81     left_write(MCP23017_B0_IODIRB, ~(1 << row));
     82 }
     83 
     84 void left_config(void)
     85 {
     86   left_write(MCP23017_B0_IODIRA, 0x7F);
     87   left_write(MCP23017_B0_IPOLA,  0x7F);
     88   left_write(MCP23017_B0_GPPUA,  0x7F);
     89 
     90   left_write(MCP23017_B0_IODIRB, 0xFF);
     91   left_write(MCP23017_B0_GPIOB,  0xC0);
     92 }
     93 
     94 i2c_status_t left_write(uint8_t reg, uint8_t data)
     95 {
     96   if (!i2c_initialized)
     97   {
     98     return 0;
     99   }
    100 
    101   i2c_status_t ret;
    102 
    103   ret = i2c_write_register(I2C_ADDR, reg,  &data, sizeof(data), HOTDOX_I2C_TIMEOUT); 
    104 
    105   return ret;
    106 }
    107 
    108 i2c_status_t left_read(uint8_t reg, uint8_t *data)
    109 {
    110   if (!i2c_initialized)
    111   {
    112     return 0;
    113   }
    114 
    115   i2c_status_t ret = 0;
    116   ret = i2c_read_register(I2C_ADDR, reg, data, 1, HOTDOX_I2C_TIMEOUT);
    117 
    118   return ret;
    119 }