一、目标
一个通过MIO50引脚点亮LED的驱动。
二、寄存器配置
1、GPIO 基地址:0xE000 A000
2、数据寄存器偏移:0x0000 000C(MASK_DATA_1_MSW)
3、方向寄存器偏移:0x0000 0244 (DIRM_1)
4、使能寄存器偏移:0x0000 0244 (OEN_1)
5、slcr:0xF800 0000
6、时钟:0x0000 012C(APER_CLK_CTRL)
这个寄存器的bit[22]为GPIO_CPU_1XCLKACT需要enable。
7、引脚:0x0000 07C8(MIO_PIN_50)
这个寄存器bit[0]为TRI_ENABLE,需要设置为0(disable)。
三、代码
gpio_led.c,适配linux4.14。
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/module.h>
#include <linux/miscdevice.h>
#include <linux/ioport.h>
#include <linux/of.h>
#include <linux/fs.h>
#include <asm/io.h>
#include <linux/uaccess.h>
#define DEVICE_NAME "first_gpio"
//MIO 50
#define MY_GPIO_BASE_ADDR 0xE000A000
#define XGPIOPS_DIRM_OFFSET 0x00000244U
#define XGPIOPS_OEN_OFFSET 0x00000248U
#define XGPIOPS_DATA_MSW_OFFSET 0x0000000CU
#define SLCR_BASE_ADDR 0xF8000000
#define APER_CLK_OFFSET 0x0000012C
#define MIO_PIN_OFFSET 0x000007C8
MODULE_AUTHOR("Xilinx XUP");
MODULE_DESCRIPTION("LED moudle dirver");
MODULE_VERSION("v1.0");
MODULE_LICENSE("GPL");
static int gpio_driver_major;
static struct class* gpio_driver_class = NULL;
static struct device* gpio_driver_device = NULL;
volatile unsigned long *Gpio_DIR = NULL;
volatile unsigned long *Gpio_EN = NULL;
volatile unsigned long *Gpio_DATA = NULL;
volatile unsigned long *DATA = NULL;
volatile unsigned long *CLK = NULL;
volatile unsigned long