zedboard之GPIO驱动器(离FPGA直到LINUX申请书)
笔者: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 驱动编写
#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申请书)的更多相关文章
- Xilinx zynq-7000系列FPGA移植Linux操作系统详细教程
		
Xilinx zynq-7000系列FPGA移植Linux操作系统详细教程 一:前言 最近手上压了一块米联客的Miz7035,一块xilinx zynq-7000系列的开发板,想着正好学习一下linu ...
 - zedboard之GPIO驱动(从FPGA一直到LINUX应用)
		
1 EDK 大家知道我们在EDK中建立GPIO然后倒出到SDK中,在SDK中可以用C语言操作外设GPIO,但是这还是裸机程序,没有用到LINUX.本文将记录从FPGA EDK生成GPIO一直到导入S ...
 - linux驱动初探之杂项设备(控制两个GPIO口)
		
关键字:linux驱动.杂项设备.GPIO 此驱动程序控制了外接的两个二极管,二极管是低电平有效. 上一篇博客中已经介绍了linux驱动程序的编写流程,这篇博客算是前一篇的提高篇,也是下一篇博客(JN ...
 - Davinci DM6446开发攻略——LINUX GPIO驱动源码移植
		
一. DM6446 GPIO的介绍 说到LINUX 驱动移植,没有移植过的朋友,或刚刚进入LINUX领域的朋友,最好去看看<LINUX 设备驱动程序>第三 ...
 - linux driver ------ GPIO的驱动编写和调用
		
判断哪些文件被编译进内核: 1.通过 make menuconfig 查看 2.比如查看gpio类型的文件,输入 ls drivers/gpio/*.o,有生成.o文件表示被编译进内核 在编写驱动程序 ...
 - [gpio]Linux GPIO简单使用方式1-sysfs
		
转自:http://blog.csdn.net/drivermonkey/article/details/20132241 1.1.References 1.2.GPIO Usage from a L ...
 - Linux内核驱动之GPIO子系统API接口概述
		
1.前言 在嵌入式Linux开发中,对嵌入式SoC中的GPIO进行控制非常重要,Linux内核中提供了GPIO子系统,驱动开发者在驱动代码中使用GPIO子系统提供的API函数,便可以达到对GPIO控制 ...
 - linux设备驱动程序--gpio控制
		
gpio驱动程序 上一章节linux设备驱动程序--创建设备节点章节主要介绍了linux字符设备驱动程序的框架,从这一章节开始我们讲解各种外设的控制,包括gpio,i2c,dma等等,既然是外设,那就 ...
 - Linux内核驱动学习(六)GPIO之概览
		
文章目录 前言 功能 如何使用 设备树 API 总结 前言 GPIO(General Purpose Input/Output)通用输入/输出接口,是十分灵活软件可编程的接口,功能强大,十分常用,SO ...
 
随机推荐
- [CSS] Use CSS Counters to Create Pure CSS Dynamic Lists
			
CSS counters let you create dynamic lists without JavaScript. In this lesson, we will create a multi ...
 - 0、驱动及应用小技巧、uboot指令及环境变量配置、linux常用命令
			
(内核make menuconfig之后,通过insmod安装的驱动都应该重新make,可能会出现一些莫名的问题) (nor flash/SDRAM/DM9000都受内存控制器控制,需要配置内存控制器 ...
 - jQuery获取多种input值的方法(转)
			
获取input的checked值是否为true: 第一种: if($("input[name=item][value='val']").attr('checked')==true) ...
 - <p><img src="http://img.blog.csdn.net/20150823142545135?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""></p>
			
/* 实现功能:用顺序表实现栈的各种操作 编译环境:Windows 64b,vc6.0 日期: 2015/7/20 作者:wtt561111 */ #define stack_max_num 10 # ...
 - WordPress的后台功能菜单介绍与操作,WordPress后台说明
			
WordPress网站的后台概况和登陆地址 网站都有个后台管理系统,通过网站后台,你可以改变你的网站外观,管理你网站的数据,给网站前台增加页面,文章,视频,图片或者其他功能. 通过WordPress建 ...
 - Java解惑八:很多其它库之谜
			
本文是依据JAVA解惑这本书,做的笔记. 电子书见:http://download.csdn.net/detail/u010378705/7527721 谜题76 将线程的启动方法start(),写成 ...
 - js进阶正则表达式5几个小实例(原样匹配的字符在正则中原样输出)(取反^)
			
js进阶正则表达式5几个小实例(原样匹配的字符在正则中原样输出)(取反^) 一.总结 原样匹配的字符在正则中原样输出:var reg4=/第[1-2][0-9]章/g //10-29 取反^:var ...
 - 洛谷 P3908 异或之和
			
洛谷 P3908 异或之和 题目描述 求1⨁2⨁⋯⨁N 的值. A⨁B 即 AA, B 按位异或. 输入输出格式 输入格式: 1 个整数 N . 输出格式: 1 个整数,表示所求的值. 输入输出样例 ...
 - php实现数组中的逆序对(归并排序实现:排序 辅助数组)
			
php实现数组中的逆序对(归并排序实现:排序 辅助数组) 一.总结 这题用归并排序 线段树 树状数组 等操作的复杂度应该都是小于n方的 二.php实现数组中的逆序对 题目描述 在数组中的两个数字 ...
 - 【u007】血色先锋队
			
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 巫妖王的天灾军团终于卷土重来,血色十字军组织了一支先锋军前往诺森德大陆对抗天灾军团,以及一切沾有亡灵气 ...