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应用)的更多相关文章

  1. Linux下GPIO驱动(三) ----gpio_desc()的分析

    上篇最后提出的疑问是结构体gpio_chip中的成员函数set等是怎么实现的,在回答之前先介绍下gpio_desc这个结构体. 如上图所示,右上方部分为GPIO驱动对其它驱动提供的GPIO操作接口,其 ...

  2. Linux下GPIO驱动(一) ----一个简单的LED驱动

    /******************************* * *杂项设备驱动:miscdevice *majior=10; * * *****************************/ ...

  3. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之二

    /** ****************************************************************************** * @author    暴走的小 ...

  4. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之一

    /** ****************************************************************************** * @author    暴走的小 ...

  5. 调试exynos4412—ARM嵌入式Linux—LEDS/GPIO驱动之三

    /** ****************************************************************************** * @author    暴走的小 ...

  6. 高通GPIO驱动(DTS方式)

    gpio调试的方式有很多,linux3.0以上ARM架构的处理器基本上都采用了DTS的方式,在linux3.0可以通过获取sysfs的方式来获取gpio状态: sysfs文件系统的建立可以参照下面的博 ...

  7. 开发GPIO驱动的基本套路

    最近完成了基于AR9331的GPIO驱动的开发,主要包括:控制一个连接GPIO的灯控:接收一个连接GPIO的按键事件:以及接收一个连接GPIO的脉冲事件. 这里,结合开发实践,总结一下GPIO驱动开发 ...

  8. [RK3288][Android6.0] 调试笔记 --- 通用GPIO驱动控制LED【转】

    本文转载自:http://m.blog.csdn.net/kris_fei/article/details/69553422 Platform: ROCKCHIPOS: Android 6.0Kern ...

  9. uboot的GPIO驱动分析--基于全志的A10芯片【转】

    本文转载自:http://blog.csdn.net/lw2011cg/article/details/68954707 uboot的GPIO驱动分析--基于全志的A10芯片 转载至:http://b ...

随机推荐

  1. Tcsh脚本编程

    Tcsh主要用于Free BSD等UNIX系统中. 一.输出字符串Hello的示例脚本 Tcsh脚本的基本格式.编写方法及脚本中使用的命令等,与Bash脚本完全相同,只需要直接套用即可. [root@ ...

  2. Winform下实现图片切换特效的方法

    本文实例讲述了Winform下实现图片切换特效的方法,是应用程序开发中非常实用的一个功能.分享给大家供大家参考之用.具体方法如下: 本实例源自网络,功能较为齐全.丰富!主要功能代码如下: using ...

  3. IOS 使用webview 显示 doc/docx/xls/pdf等

    在一款项目里添加阅读各种文档功能 那么对在线的文档或者是下载后的文档 进行阅读,比如 doc/docx/xls/pdf等文件 有两种方法总结如下: 1. - (void)viewDidLoad { [ ...

  4. CNZZ每天百亿条日志写入,SLS+ODPS轻松拆招

    如果你是一个站长,想要提交一个查询,从一亿多条日志中找出从湖南省发出.使用ISP电信.通过百度搜索跳转到达的访问日志.该怎么做? 别急,在接收到您的查询条件后,CNZZ可以快速通过SLS(简单日志服务 ...

  5. 【Android 界面效果45】ViewPager源码分析

    ViewPager概述: Layout manager that allows the user to flip left and right through pages of data. You s ...

  6. 编译代码报出Android library projects cannot be launched错误的解决

    Android library projects cannot be launched错误的解决方法: 右键工程根目录->properties 左侧选择->android

  7. JVM 运行时内存结构

      1.JVM内存模型       JVM运行时内存=共享内存区+线程内存区 1).共享内存区       共享内存区=持久带+堆       持久带=方法区+其他       堆=Old Space ...

  8. Linux常用命令之grep

    标题:grep命令的使用 作用:grep可以解析一行文字,取得关键字,若该行存在关键字,就会整行列出.    grep [-acinv] [--color=auto] '查找字符串' filename ...

  9. oracle PL/SQL(procedure language/SQL)程序设计(在PL/SQL中使用SQL)

    在PL/SQL程序中,允许使用的SQL语句只有DML和事务控制语句,使用DDL语句是非法的.使用SELECT语句从数据库中选取数据时,只能返回一行数据.使用COMMIT,  ROLLBACK, 和SA ...

  10. Divisibility by Eight (数学)

    Divisibility by Eight time limit per test 2 seconds memory limit per test 256 megabytes input standa ...