ZYNQ7000-Linux-MIO-LED

本文档详细介绍了如何在ZYNQ7000平台上,通过配置寄存器和编写GPIO驱动代码,实现使用MIO50引脚点亮LED。涉及到的寄存器包括GPIO基地址、数据寄存器、方向寄存器、使能寄存器等,并提到了slcr和时钟控制。虽然在测试中遇到了out of tree module taints kernel的问题,但提供了参考代码。
摘要由CSDN通过智能技术生成

一、目标

一个通过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 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值