From dfc09d8b14d15015b4afa5d674786ec74f616772 Mon Sep 17 00:00:00 2001 From: lonkaars Date: Sun, 12 May 2024 15:00:54 +0200 Subject: get pin 19 working --- 1/config.h | 15 +++++++++++++-- 1/fopdrv.c | 11 ++++++++++- 1/main.c | 21 +++++++++++++++++++++ readme.md | 4 ++++ 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/1/config.h b/1/config.h index 6326354..dbe3a86 100644 --- a/1/config.h +++ b/1/config.h @@ -9,7 +9,18 @@ typedef uint32_t ti_am335x_word_t; // p. 180: "Control Module" -#define TI_AM335X_CM_ADDR ((ti_am335x_word_t*) 0x44E1_0000) +#define TI_AM335X_CM_ADDR 0x44E10000 +// p. 182: "GPIO1" +#define TI_AM335X_GPIO1_ADDR 0x4804C000 // p. 1459: "conf_gpmc_a3" -#define TI_AM335X_CM_GPMC_A3_ADDR ((ti_am335x_word_t*) TI_AM3358_CM_ADDR + 0x84Ch) +#define TI_AM335X_CM_GPMC_A3_ADDR (TI_AM335X_CM_ADDR + 0x84C) +// p. 4990, variable names copied as-is +#define GPIO_OE (0x134 / (sizeof(ti_am335x_word_t))) +#define GPIO_DATAIN (0x138 / (sizeof(ti_am335x_word_t))) +#define GPIO_CLEARDATAOUT (0x190 / (sizeof(ti_am335x_word_t))) +#define GPIO_SETDATAOUT (0x194 / (sizeof(ti_am335x_word_t))) +// total size of GPIO registers from p. 4990 (in bytes) +#define GPIO_REG_SIZE 0x198 + +#define PIN 19 diff --git a/1/fopdrv.c b/1/fopdrv.c index e0ad41c..d048f15 100644 --- a/1/fopdrv.c +++ b/1/fopdrv.c @@ -1,4 +1,7 @@ +#include + #include "fopdrv.h" +#include "config.h" // driver/char/mem.c read_null (/dev/null) ssize_t fop_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { @@ -6,7 +9,6 @@ ssize_t fop_read(struct file *file, char __user *buf, size_t count, loff_t *ppos return 0; } -// driver/char/mem.c write_null ssize_t fop_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) { printk("%s(, , %u, )\n", __PRETTY_FUNCTION__, count); @@ -18,13 +20,20 @@ ssize_t fop_write(struct file *file, const char __user *buf, size_t count, loff_ if (copy_from_user(input_buf + *ppos, buf, count)) return -EFAULT; + ti_am335x_word_t* gpio1 = ioremap(TI_AM335X_GPIO1_ADDR, GPIO_REG_SIZE); + barrier(); + if (input_buf[0] == '0') { printk("TODO: TURN OFF OUTPUT\n"); + iowrite32((1< #include #include +#include #include "fopdrv.h" #include "config.h" @@ -63,6 +64,26 @@ static int mod_init(void) { printk("%s() -> 0 (%d:%d)\n", __PRETTY_FUNCTION__, MAJOR(node), MINOR(node)); printk("one = %d, two = %d\n", one, not_named_two); + + // configure gpio mux + uint32_t* conf_gpmc_a3 = ioremap(TI_AM335X_CM_GPMC_A3_ADDR, sizeof(ti_am335x_word_t)); + if (conf_gpmc_a3 == NULL) + return -EINVAL; + barrier(); + uint32_t val = ioread32(conf_gpmc_a3); rmb(); + val &= ~0x7; + val |= 0x7; + iowrite32(val, conf_gpmc_a3); wmb(); + iounmap(conf_gpmc_a3); + + // configure output pin + ti_am335x_word_t* gpio1 = ioremap(TI_AM335X_GPIO1_ADDR, GPIO_REG_SIZE); + barrier(); + ti_am335x_word_t oe_reg = ioread32(gpio1 + GPIO_OE); rmb(); + oe_reg &= ~(1<