aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2021-06-03 13:19:46 +0200
committerHarald Welte <laforge@osmocom.org>2021-06-03 14:37:45 +0200
commitdd5794c975ffbf58d05f8ddf6c463df567e4bf1e (patch)
treee1838281eafd3246553ad4c754538c433c5c4c96
parentd46f6bae2c5c6af9ba5ea80ca6a7a88fc4ddf712 (diff)
firmware: octsimtest: mcp23017 initializaiton
* driver should not have hard-coded understanding about I/O directions * board code should pass the I/O direction to driver * board code should use the correct I/O directions (A0..7, B0: output) Change-Id: Id4a8e012a33cee01bb489e612e17920760b9be59
-rw-r--r--firmware/libboard/octsimtest/include/mcp23017.h2
-rw-r--r--firmware/libboard/octsimtest/source/board_octsimtest.c8
-rw-r--r--firmware/libboard/octsimtest/source/mcp23017.c20
3 files changed, 20 insertions, 10 deletions
diff --git a/firmware/libboard/octsimtest/include/mcp23017.h b/firmware/libboard/octsimtest/include/mcp23017.h
index 962a1d5..c0f4b13 100644
--- a/firmware/libboard/octsimtest/include/mcp23017.h
+++ b/firmware/libboard/octsimtest/include/mcp23017.h
@@ -18,7 +18,7 @@
#define MCP23017_ADDRESS 0x20
-int mcp23017_init(uint8_t slave);
+int mcp23017_init(uint8_t slave, uint8_t iodira, uint8_t iodirb);
int mcp23017_test(uint8_t slave);
int mcp23017_toggle(uint8_t slave);
//int mcp23017_write_byte(uint8_t slave, uint8_t addr, uint8_t byte);
diff --git a/firmware/libboard/octsimtest/source/board_octsimtest.c b/firmware/libboard/octsimtest/source/board_octsimtest.c
index 85d8aab..404bef6 100644
--- a/firmware/libboard/octsimtest/source/board_octsimtest.c
+++ b/firmware/libboard/octsimtest/source/board_octsimtest.c
@@ -17,6 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA
*/
+#include <stdbool.h>
#include "board.h"
#include "simtrace.h"
#include "utils.h"
@@ -27,6 +28,8 @@
#include "mcp23017.h"
#include "mux.h"
+static bool mcp2317_present = false;
+
void board_exec_dbg_cmd(int ch)
{
switch (ch) {
@@ -69,8 +72,9 @@ void board_main_top(void)
mux_init();
i2c_pin_init();
- if (!mcp23017_init(MCP23017_ADDRESS))
- printf("mcp23017 not found!\n\r");
+ /* PORT A: all outputs, Port B0 output, B1..B7 unused */
+ if (mcp23017_init(MCP23017_ADDRESS, 0x00, 0xfe) == 0)
+ mcp2317_present = true;
/* Initialize checking for card insert/remove events */
//card_present_init();
#endif
diff --git a/firmware/libboard/octsimtest/source/mcp23017.c b/firmware/libboard/octsimtest/source/mcp23017.c
index 167bf34..a4d055f 100644
--- a/firmware/libboard/octsimtest/source/mcp23017.c
+++ b/firmware/libboard/octsimtest/source/mcp23017.c
@@ -92,19 +92,25 @@ out_stop:
return 0;
}
-int mcp23017_init(uint8_t slave)
+int mcp23017_init(uint8_t slave, uint8_t iodira, uint8_t iodirb)
{
printf("mcp23017_init\n\r");
+
// all gpio input
- if (mcp23017_write_byte(slave, MCP23017_IODIRA, 0xff))
- return false;
+ if (mcp23017_write_byte(slave, MCP23017_IODIRA, iodira))
+ goto out_err;
// msb of portb output, rest input
- if (mcp23017_write_byte(slave, MCP23017_IODIRB, 0x7f))
- return false;
+ if (mcp23017_write_byte(slave, MCP23017_IODIRB, iodirb))
+ goto out_err;
if (mcp23017_write_byte(slave, MCP23017_IOCONA, 0x20)) //disable SEQOP (autoinc addressing)
- return false;
+ goto out_err;
+
printf("mcp23017 found\n\r");
- return true;
+ return 0;
+
+out_err:
+ printf("mcp23017 NOT found!\n\r");
+ return -1;
}
int mcp23017_test(uint8_t slave)