笔者:xiabodan   资源: http://blog.csdn.net/xiabodan/article/details/24308373

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 驱动编写

  1. #include <linux/module.h>
  2. #include <linux/kernel.h>
  3. #include <linux/fs.h>
  4. #include <linux/device.h>
  5. #include <asm/io.h>
  6.  
  7. #define DEVICE_NAME "AXI_GPIO_MOUDLE"
  8. #define PWM_MOUDLE_PHY_ADDR 0x41200000 //This Address is based XPS 见图1
  9.  
  10. MODULE_AUTHOR("Xilinx ");
  11. MODULE_DESCRIPTION("AXI GPIO moudle dirver");
  12. MODULE_VERSION("v1.0");
  13. MODULE_LICENSE("GPL");
  14.  
  15. static int pwm_driver_major;
  16. static struct class* axi_gpio_driver_class = NULL;
  17. static struct device* axi_gpio_driver_device = NULL;
  18.  
  19. unsigned long AXI_gpio_fre_addr = 0; //AXI_GPIO moulde's visual address
  20.  
  21. static struct file_operations axi_gpio_fops = {
  22. .owner = THIS_MODULE,
  23. };
  24.  
  25. static ssize_t sys_axi_gpio_set (struct device* dev, struct device_attribute* attr, const char* buf, size_t count)
  26. {
  27. // unsigned int direg;
  28. //unsigned int opreg;
  29.  
  30. printk("I am come in");
  31.  
  32. outl(0x00000000, pwm_fre_addr+12); //设置AXI GPIO的方向输出
  33. outl(0xffffffff, pwm_fre_addr+8); //设置AXI GPIO的方向输出全为高
  34. printk("sys_axi_gpio_set pwm_fre_adr is %ld \n",axi_gpio_fre_addr);
  35.  
  36. return count;
  37. }
  38.  
  39. static DEVICE_ATTR(axi_gpio, S_IWUSR, NULL, sys_axi_gpio_set);
  40.  
  41. static int __init axi_gpio_driver_module_init(void)
  42. {
  43. int ret;
  44.  
  45. axi_gpio_driver_major=register_chrdev(0, DEVICE_NAME, &axi_gpio_fops );//内核注冊设备驱动
  46. if (axi_gpio_driver_major < 0){
  47. printk("failed to register device.\n");
  48. return -1;
  49. }
  50.  
  51. axi_gpio_driver_class = class_create(THIS_MODULE, "axi_gpio_driver");//创建设备类
  52. if (IS_ERR(axi_gpio_driver_class)){
  53. printk("failed to create zxi_gpio moudle class.\n");
  54. unregister_chrdev(axi_gpio_driver_major, DEVICE_NAME);
  55. return -1;
  56. }
  57.  
  58. axi_gpio_driver_device = device_create(axi_gpio_driver_class, NULL, MKDEV(axi_gpio_driver_major, 0), NULL, "axi_gpio_device");
  59. if (IS_ERR(axi_gpio_driver_device)){
  60. printk("failed to create device .\n");
  61. unregister_chrdev(axi_gpio_driver_major, DEVICE_NAME);
  62. return -1;
  63. }
  64.  
  65. ret = device_create_file(axi_gpio_driver_device, &dev_attr_axi_gpio); //
  66. if (ret < 0)
  67. printk("failed to create axi_gpio endpoint\n");
  68.  
  69. axi_gpio_fre_addr = (unsigned long)ioremap(PWM_MOUDLE_PHY_ADDR, sizeof(u32));//To get Custom IP--gpio moudle's virtual address
  70. //将模块的物理地址映射到虚拟地址上
  71. printk(" axi_gpio driver initial successfully!\n"); return 0;}
  72. static void __exit axi_gpio_driver_module_exit(void)
  73. {
  74. device_remove_file(axi_gpio_driver_device, &dev_attr_axi_gpio);
  75. device_destroy(axi_gpio_driver_class, MKDEV(axi_gpio_driver_major, 0));
  76. class_unregister(axi_gpio_driver_class);
  77. class_destroy(axi_gpio_driver_class);
  78. unregister_chrdev(axi_gpio_driver_major, DEVICE_NAME);
  79. printk("axi_gpio module exit.\n");
  80. }
  81.  
  82. module_init(axi_gpio_driver_module_init);
  83. 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. Xilinx zynq-7000系列FPGA移植Linux操作系统详细教程

    Xilinx zynq-7000系列FPGA移植Linux操作系统详细教程 一:前言 最近手上压了一块米联客的Miz7035,一块xilinx zynq-7000系列的开发板,想着正好学习一下linu ...

  2. zedboard之GPIO驱动(从FPGA一直到LINUX应用)

    1 EDK 大家知道我们在EDK中建立GPIO然后倒出到SDK中,在SDK中可以用C语言操作外设GPIO,但是这还是裸机程序,没有用到LINUX.本文将记录从FPGA  EDK生成GPIO一直到导入S ...

  3. linux驱动初探之杂项设备(控制两个GPIO口)

    关键字:linux驱动.杂项设备.GPIO 此驱动程序控制了外接的两个二极管,二极管是低电平有效. 上一篇博客中已经介绍了linux驱动程序的编写流程,这篇博客算是前一篇的提高篇,也是下一篇博客(JN ...

  4. Davinci DM6446开发攻略——LINUX GPIO驱动源码移植

    一.             DM6446 GPIO的介绍      说到LINUX 驱动移植,没有移植过的朋友,或刚刚进入LINUX领域的朋友,最好去看看<LINUX 设备驱动程序>第三 ...

  5. linux driver ------ GPIO的驱动编写和调用

    判断哪些文件被编译进内核: 1.通过 make menuconfig 查看 2.比如查看gpio类型的文件,输入 ls drivers/gpio/*.o,有生成.o文件表示被编译进内核 在编写驱动程序 ...

  6. [gpio]Linux GPIO简单使用方式1-sysfs

    转自:http://blog.csdn.net/drivermonkey/article/details/20132241 1.1.References 1.2.GPIO Usage from a L ...

  7. Linux内核驱动之GPIO子系统API接口概述

    1.前言 在嵌入式Linux开发中,对嵌入式SoC中的GPIO进行控制非常重要,Linux内核中提供了GPIO子系统,驱动开发者在驱动代码中使用GPIO子系统提供的API函数,便可以达到对GPIO控制 ...

  8. linux设备驱动程序--gpio控制

    gpio驱动程序 上一章节linux设备驱动程序--创建设备节点章节主要介绍了linux字符设备驱动程序的框架,从这一章节开始我们讲解各种外设的控制,包括gpio,i2c,dma等等,既然是外设,那就 ...

  9. Linux内核驱动学习(六)GPIO之概览

    文章目录 前言 功能 如何使用 设备树 API 总结 前言 GPIO(General Purpose Input/Output)通用输入/输出接口,是十分灵活软件可编程的接口,功能强大,十分常用,SO ...

随机推荐

  1. 7、linux系统2440开发板域名解析问题

    如果在linux系统中ping某一台电脑的ip地址可以ping 通: ~ >: ping 192.168.1.3PING 192.168.1.3 (192.168.1.3): 56 data b ...

  2. POJ 1251 Jungle Roads (zoj 1406) MST

    传送门: http://poj.org/problem?id=1251 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=406 P ...

  3. [转载]Ocelot简易教程(六)之重写配置文件存储方式并优化响应数据

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9807125.html 很多人都说配置文件的配置很繁琐,如果存储在数据库就方便很多,可以通过自定义UI界面 ...

  4. 段的创建表user_segments 分类: H2_ORACLE 2013-08-10 11:13 714人阅读 评论(0) 收藏

    1.段的定义及类型 Oracle中的段(segment)是占用磁盘空间的一个对象,最常见的段类型包括: l  聚簇cluster l  表table l  表分区 tablepartition l  ...

  5. js课程 1-5 js如何测试变量的数据类型

    js课程 1-5 js如何测试变量的数据类型 一.总结 一句话总结:用typeof()方法. 1.js如何判断变量的数据类型? 用typeof()方法. 13 v=10; 14 15 if(typeo ...

  6. python 标准库 —— io(StringIO)

    0. io流(io stream) 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操作 ...

  7. windows phone 2048 源代码奉上

    小梦今天把2048的游戏源代码给大家分享一下,其实感觉这个重在算法,UI很简单,而且几乎没有用到什么windows phone的API.小梦遇到最主要的问题就是对触摸事件的处理,我刚开始想到的就是 M ...

  8. CentOS7.1 KVM虚拟化之虚拟机快照(5)

    这里用之前克隆的虚拟机vm1-clone进行快照操作 注: 1.快照实际上做的是虚拟机的XML配置文件,默认快照XML文件在/var/lib/libvirt/qemu/snapshot/虚拟机名/下 ...

  9. android webview中的音乐的暂停与播放

    前段时间有这样一个需求,webview显示一个带音乐的网页,在播放音乐的时候进入第三方软件暂停播放,返回时继续播放.后来参考了两篇文章解决了这个问题. AudioManager audioManage ...

  10. 不使用left-join等多表关联查询,只用单表查询和Java程序,简便实现“多表查询”效果

    上次我们提到,不使用left-loin关联查询,可能是为了提高效率或者配置缓存,也可以简化一下sql语句的编写.只写单表查询,sql真得太简单了.问题是,查询多个表的数据还是非常需要的. 因此,存在这 ...