forked from mirrors/qmk_userspace
		
	Move driver to core (#15944)
This commit is contained in:
		
					parent
					
						
							
								2e279f1b88
							
						
					
				
			
			
				commit
				
					
						74e8a71768
					
				
			
		
					 4 changed files with 72 additions and 52 deletions
				
			
		| 
						 | 
				
			
			@ -1,18 +1,6 @@
 | 
			
		|||
/* Copyright 2020 zvecr<git@zvecr.com>
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
// Copyright 2022 zvecr<git@zvecr.com>
 | 
			
		||||
// SPDX-License-Identifier: GPL-2.0-or-later
 | 
			
		||||
 | 
			
		||||
#include "mcp23018.h"
 | 
			
		||||
#include "i2c_master.h"
 | 
			
		||||
#include "wait.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -40,7 +28,7 @@ void mcp23018_init(uint8_t addr) {
 | 
			
		|||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool mcp23018_set_config(uint8_t slave_addr, uint8_t port, uint8_t conf) {
 | 
			
		||||
bool mcp23018_set_config(uint8_t slave_addr, mcp23018_port_t port, uint8_t conf) {
 | 
			
		||||
    uint8_t addr         = SLAVE_TO_ADDR(slave_addr);
 | 
			
		||||
    uint8_t cmdDirection = port ? CMD_IODIRB : CMD_IODIRA;
 | 
			
		||||
    uint8_t cmdPullup    = port ? CMD_GPPUB : CMD_GPPUA;
 | 
			
		||||
| 
						 | 
				
			
			@ -60,7 +48,7 @@ bool mcp23018_set_config(uint8_t slave_addr, uint8_t port, uint8_t conf) {
 | 
			
		|||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool mcp23018_set_output(uint8_t slave_addr, uint8_t port, uint8_t conf) {
 | 
			
		||||
bool mcp23018_set_output(uint8_t slave_addr, mcp23018_port_t port, uint8_t conf) {
 | 
			
		||||
    uint8_t addr = SLAVE_TO_ADDR(slave_addr);
 | 
			
		||||
    uint8_t cmd  = port ? CMD_GPIOB : CMD_GPIOA;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -86,7 +74,7 @@ bool mcp23018_set_output_all(uint8_t slave_addr, uint8_t confA, uint8_t confB) {
 | 
			
		|||
    return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool mcp23018_readPins(uint8_t slave_addr, uint8_t port, uint8_t* out) {
 | 
			
		||||
bool mcp23018_readPins(uint8_t slave_addr, mcp23018_port_t port, uint8_t* out) {
 | 
			
		||||
    uint8_t addr = SLAVE_TO_ADDR(slave_addr);
 | 
			
		||||
    uint8_t cmd  = port ? CMD_GPIOB : CMD_GPIOA;
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										65
									
								
								drivers/gpio/mcp23018.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								drivers/gpio/mcp23018.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,65 @@
 | 
			
		|||
// Copyright 2022 zvecr<git@zvecr.com>
 | 
			
		||||
// SPDX-License-Identifier: GPL-2.0-or-later
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Port ID
 | 
			
		||||
 */
 | 
			
		||||
typedef enum {
 | 
			
		||||
    mcp23018_PORTA,
 | 
			
		||||
    mcp23018_PORTB,
 | 
			
		||||
} mcp23018_port_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Helpers for set_config
 | 
			
		||||
 */
 | 
			
		||||
enum {
 | 
			
		||||
    ALL_OUTPUT = 0,
 | 
			
		||||
    ALL_INPUT  = 0xFF,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Helpers for set_output
 | 
			
		||||
 */
 | 
			
		||||
enum {
 | 
			
		||||
    ALL_LOW  = 0,
 | 
			
		||||
    ALL_HIGH = 0xFF,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Init expander and any other dependent drivers
 | 
			
		||||
 */
 | 
			
		||||
void mcp23018_init(uint8_t slave_addr);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Configure input/output to a given port
 | 
			
		||||
 */
 | 
			
		||||
bool mcp23018_set_config(uint8_t slave_addr, mcp23018_port_t port, uint8_t conf);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Write high/low to a given port
 | 
			
		||||
 */
 | 
			
		||||
bool mcp23018_set_output(uint8_t slave_addr, mcp23018_port_t port, uint8_t conf);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Write high/low to both ports sequentially
 | 
			
		||||
 *
 | 
			
		||||
 *  - slightly faster than multiple set_output
 | 
			
		||||
 */
 | 
			
		||||
bool mcp23018_set_output_all(uint8_t slave_addr, uint8_t confA, uint8_t confB);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Read state of a given port
 | 
			
		||||
 */
 | 
			
		||||
bool mcp23018_readPins(uint8_t slave_addr, mcp23018_port_t port, uint8_t* ret);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Read state of both ports sequentially
 | 
			
		||||
 *
 | 
			
		||||
 *  - slightly faster than multiple readPins
 | 
			
		||||
 */
 | 
			
		||||
bool mcp23018_readPins_all(uint8_t slave_addr, uint16_t* ret);
 | 
			
		||||
| 
						 | 
				
			
			@ -1,34 +0,0 @@
 | 
			
		|||
/* Copyright 2020 zvecr<git@zvecr.com>
 | 
			
		||||
 *
 | 
			
		||||
 * This program is free software: you can redistribute it and/or modify
 | 
			
		||||
 * it under the terms of the GNU General Public License as published by
 | 
			
		||||
 * the Free Software Foundation, either version 2 of the License, or
 | 
			
		||||
 * (at your option) any later version.
 | 
			
		||||
 *
 | 
			
		||||
 * This program is distributed in the hope that it will be useful,
 | 
			
		||||
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
			
		||||
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
			
		||||
 * GNU General Public License for more details.
 | 
			
		||||
 *
 | 
			
		||||
 * You should have received a copy of the GNU General Public License
 | 
			
		||||
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 | 
			
		||||
 */
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#include <stdbool.h>
 | 
			
		||||
 | 
			
		||||
#define mcp23018_PORTA 0
 | 
			
		||||
#define mcp23018_PORTB 1
 | 
			
		||||
 | 
			
		||||
#define ALL_OUTPUT 0
 | 
			
		||||
#define ALL_INPUT 0xFF
 | 
			
		||||
#define ALL_LOW 0
 | 
			
		||||
#define ALL_HIGH 0xFF
 | 
			
		||||
 | 
			
		||||
void mcp23018_init(uint8_t addr);
 | 
			
		||||
bool mcp23018_set_config(uint8_t slave_addr, uint8_t port, uint8_t conf);
 | 
			
		||||
bool mcp23018_set_output(uint8_t slave_addr, uint8_t port, uint8_t conf);
 | 
			
		||||
bool mcp23018_set_output_all(uint8_t slave_addr, uint8_t confA, uint8_t confB);
 | 
			
		||||
bool mcp23018_readPins(uint8_t slave_addraddr, uint8_t port, uint8_t* ret);
 | 
			
		||||
bool mcp23018_readPins_all(uint8_t slave_addr, uint16_t* ret);
 | 
			
		||||
| 
						 | 
				
			
			@ -22,5 +22,6 @@ LTO_ENABLE = yes            # Smaller (and slightly faster) firmware
 | 
			
		|||
# custom matrix setup
 | 
			
		||||
CUSTOM_MATRIX = lite
 | 
			
		||||
 | 
			
		||||
VPATH += drivers/gpio
 | 
			
		||||
SRC += mcp23018.c matrix.c
 | 
			
		||||
QUANTUM_LIB_SRC += i2c_master.c
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue