zedboard之GPIO驱动(从FPGA一直到LINUX应用)
1 EDK
大家知道我们在EDK中建立GPIO然后倒出到SDK中,在SDK中可以用C语言操作外设GPIO,但是这还是裸机程序,没有用到LINUX。本文将记录从FPGA EDK生成GPIO一直到导入SDK中,建立.fsbl文件,creat BOOT.BIN,然后根据前面的文章(生成uboot.elf 以及生成zImage,.dtb文件)。然后我们在linux中编写GPIO驱动程序,操作我们在FPGA中建立的GPIO。这个过程十分复杂任何一个方面都要搞几个月,但是站在巨人的肩膀上就是好。
首先我们要在EDK中建立GPIO外设,这里我用的AXI_GPIO,详细的过程不讲述了,可以参考官网资料CTT:http://download.csdn.net/detail/xiabodan/7235031
图 1 FPGA 硬件地址分配表
图2 硬件设计
2 SDK
然后到出到SDK,生成BOOT.BIN,具体步骤见http://blog.csdn.net/xiabodan/article/details/23379645
3 驱动编写
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <asm/io.h> #define DEVICE_NAME "AXI_GPIO_MOUDLE"
#define PWM_MOUDLE_PHY_ADDR 0x41200000 //This Address is based XPS 见图1 MODULE_AUTHOR("Xilinx ");
MODULE_DESCRIPTION("AXI GPIO moudle dirver");
MODULE_VERSION("v1.0");
MODULE_LICENSE("GPL"); static int pwm_driver_major;
static struct class* axi_gpio_driver_class = NULL;
static struct device* axi_gpio_driver_device = NULL; unsigned long AXI_gpio_fre_addr = 0; //AXI_GPIO moulde's visual address static struct file_operations axi_gpio_fops = {
.owner = THIS_MODULE,
}; static ssize_t sys_axi_gpio_set (struct device* dev, struct device_attribute* attr, const char* buf, size_t count)
{
// unsigned int direg;
//unsigned int opreg; printk("I am come in"); outl(0x00000000, pwm_fre_addr+12); //设置AXI GPIO的方向输出
outl(0xffffffff, pwm_fre_addr+8); //设置AXI GPIO的方向输出全为高
printk("sys_axi_gpio_set pwm_fre_adr is %ld \n",axi_gpio_fre_addr); return count;
} static DEVICE_ATTR(axi_gpio, S_IWUSR, NULL, sys_axi_gpio_set); static int __init axi_gpio_driver_module_init(void)
{
int ret; axi_gpio_driver_major=register_chrdev(0, DEVICE_NAME, &axi_gpio_fops );//内核注册设备驱动
if (axi_gpio_driver_major < 0){
printk("failed to register device.\n");
return -1;
} axi_gpio_driver_class = class_create(THIS_MODULE, "axi_gpio_driver");//创建设备类
if (IS_ERR(axi_gpio_driver_class)){
printk("failed to create zxi_gpio moudle class.\n");
unregister_chrdev(axi_gpio_driver_major, DEVICE_NAME);
return -1;
} axi_gpio_driver_device = device_create(axi_gpio_driver_class, NULL, MKDEV(axi_gpio_driver_major, 0), NULL, "axi_gpio_device");
if (IS_ERR(axi_gpio_driver_device)){
printk("failed to create device .\n");
unregister_chrdev(axi_gpio_driver_major, DEVICE_NAME);
return -1;
} ret = device_create_file(axi_gpio_driver_device, &dev_attr_axi_gpio); //
if (ret < 0)
printk("failed to create axi_gpio endpoint\n"); axi_gpio_fre_addr = (unsigned long)ioremap(PWM_MOUDLE_PHY_ADDR, sizeof(u32));//To get Custom IP--gpio moudle's virtual address
//将模块的物理地址映射到虚拟地址上
printk(" axi_gpio driver initial successfully!\n"); return 0;}
static void __exit axi_gpio_driver_module_exit(void)
{
device_remove_file(axi_gpio_driver_device, &dev_attr_axi_gpio);
device_destroy(axi_gpio_driver_class, MKDEV(axi_gpio_driver_major, 0));
class_unregister(axi_gpio_driver_class);
class_destroy(axi_gpio_driver_class);
unregister_chrdev(axi_gpio_driver_major, DEVICE_NAME);
printk("axi_gpio module exit.\n");
} module_init(axi_gpio_driver_module_init);
module_exit(axi_gpio_driver_module_exit);
4 编写makefile 然后编译驱动
具体见博客 http://blog.csdn.net/xiabodan/article/details/24236757
5 加载insmod
insmod gpio.ko
进入/sys/class/axi_gpio/
在此目录下 echo 0 > axi_gpio
可以看到zedboard上所有的LED都亮了
6 声明
其实以上的做法是不对的 因为理论上讲 驱动只为我们提供策略,不应该在驱动里面实现功能函数,不然就和裸鸡程序一抹一样了,但是这里我只是本着测试目的,不必较真。
7 参 考
digilent官方资料www.digilent.org
ZYNQ外设datasheet(GPIO 等等可以在EDK生成)
嵌入式系统软硬件协同设计实战指南基于Xilinx zynq . 陆佳华
xilinx all programmable Zynq-7000 soc 何宾
懒兔子博客 http://www.eefocus.com/nightseas/blog/cate_12977_0.html
肖志远博客:http://blog.csdn.net/column/details/zynq.html
zedboard之GPIO驱动(从FPGA一直到LINUX应用)的更多相关文章
- Linux下GPIO驱动(三) ----gpio_desc()的分析
上篇最后提出的疑问是结构体gpio_chip中的成员函数set等是怎么实现的,在回答之前先介绍下gpio_desc这个结构体. 如上图所示,右上方部分为GPIO驱动对其它驱动提供的GPIO操作接口,其 ...
- Linux下GPIO驱动(一) ----一个简单的LED驱动
/******************************* * *杂项设备驱动:miscdevice *majior=10; * * *****************************/ ...
- 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之二
/** ****************************************************************************** * @author 暴走的小 ...
- 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之一
/** ****************************************************************************** * @author 暴走的小 ...
- 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之三
/** ****************************************************************************** * @author 暴走的小 ...
- 高通GPIO驱动(DTS方式)
gpio调试的方式有很多,linux3.0以上ARM架构的处理器基本上都采用了DTS的方式,在linux3.0可以通过获取sysfs的方式来获取gpio状态: sysfs文件系统的建立可以参照下面的博 ...
- 开发GPIO驱动的基本套路
最近完成了基于AR9331的GPIO驱动的开发,主要包括:控制一个连接GPIO的灯控:接收一个连接GPIO的按键事件:以及接收一个连接GPIO的脉冲事件. 这里,结合开发实践,总结一下GPIO驱动开发 ...
- [RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED【转】
本文转载自:http://m.blog.csdn.net/kris_fei/article/details/69553422 Platform: ROCKCHIPOS: Android 6.0Kern ...
- uboot的GPIO驱动分析--基于全志的A10芯片【转】
本文转载自:http://blog.csdn.net/lw2011cg/article/details/68954707 uboot的GPIO驱动分析--基于全志的A10芯片 转载至:http://b ...
随机推荐
- LeetCode35 Search Insert Position
题目: Given a sorted array and a target value, return the index if the target is found. If not, return ...
- 使用idea创建maven的web项目
如果是第一次打开软件直接点击 Create New Project ,如果之前已经打开过项目了,需要点击菜单中 File → New Project … 如下图: 选择 Maven module ,输 ...
- IIS错误日志:Failed to execute request because the App-Domain
装上IIS和.net2.0框架后,打开ASP.NET站点,出现Server Application Error,出先此问题,一般先看系统的“事件管理器”,于是查看服务器的“事件管理器”中的“应用程序” ...
- ACMer
Problem Description There are at least P% and at most Q% students of HDU are ACMers, now I want to k ...
- Java基础知识强化之IO流笔记82:NIO之 Pipe(管道)
1. Java NIO 管道是2个线程之间的单向数据连接.Pipe有一个source通道和一个sink通道.数据会被写到sink通道,从source通道读取. 这里是Pipe原理的图示: 2. Pip ...
- Dapper ORM 用法
假如你喜欢原生的Sql语句,又喜欢ORM的简单,那你一定会喜欢上Dapper这款ROM.Dapper的优势:1,Dapper是一个轻型的ORM类.代码就一个SqlMapper.cs文件,编译后就40K ...
- Java Script基础(一)
一.为什么学习JavaScript 学习JavaScript主要有以下两点原因. 1.客户端表单验证. 2.实现页面交互(网页特效) 二.什么是JavaScript JavaScript是一种描述语言 ...
- Javascript函数(定义、传值、重载)
Javascript 函数的定义的方式有不止一种. 第一种方式: function fn1(){ alert(typeof fn1); alert(“fn1”); } 在调用的时候直接就可以fu1() ...
- ReactNative学习-ListView
ListView相对于View的优点就在于可以不用一下子就把数据加载完,而是滑动着加载着数据,可以缓解数据加载,避免软件卡死. 官方文档:https://facebook.github.io/reac ...
- System.Data.OracleClient requires Oracle client software version 8.1.7 or greater
It is a security issue, so to fix it simply do the following: Go to the Oracle folder. 1- Right Clic ...