一.目标
在米尔科技zynq的z-turn开发板上,通过编写驱动,实现对两盏灯的控制。
二.分析
①硬件部分
这两盏绿灯位于zynq的MIO0和MIO9上。
有关操作IO口的地址,查找ug585-zynq-7000-TRM手册
可以看出GPIO基地址为0xe000a000,同样的有关IO操作的寄存器相对地址可以从手册中找到。
②boot.bin生成
在vivado上进行配置IP等一些列操作,导入SDK中产生。
三.代码实现
①驱动代码
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <asm/io.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/miscdevice.h>
#include <linux/ioport.h>
#include <linux/of.h>
#include <linux/uaccess.h>
/**
* LED MIO驱动
*
*MIO0---LED1
*MIO9---LED2
*
*
*
*
*
*
* **/
//驱动框架
int major;
//MIO基地址
#define GPIO_BASE_Address 0xe000a000
volatile unsigned int *mask_data_lsw;
//屏蔽输出低16bit
#define MASK_DATA_0_LSW 0X00000000
volatile unsigned int *mask_data_msw;
//屏蔽输出高16bit
#define MASK_DATA_0_MSW 0X00000004
volatile unsigned int *data;
//输出数据
#define DATA_0 0X00000040
volatile unsigned int *dirm;
//配置I/O口方向
#define DIRM_0 0X00000204
volatile unsigned int *oen;
//输出使能
#define OEN_0 0X00000208
volatile unsigned int *clk;
//时钟地址
#define CLK_ADDR 0XF800012C
static struct class *led_class = NULL;
static struct device *led_device = NULL;
static int led_init(void);
static int led_exit(void);
static int led_open(struct inode *inode,struct