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 ...
随机推荐
- Linux Shell之top命令
TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中C ...
- storm0.9.0.1安装
storm 0.9.x的好处是引入了netty进行网络传输(需要配置),不用再依赖zeromq和jzmq了 1.下载安装zookeeper ... 2.下载安装storm依赖库 JDK1.6及以上 . ...
- Handler发送消息
Handler发送消息小结 字数283 阅读210 评论0 喜欢1 obtainMessage()得到一个Message对象. 创建一个Message然后发送是这么写的: Message msg = ...
- IOS Xcode 无法识别IOS device 突然发生的
今天 我用真机mini好好地 ,再想测试一下iphone 4 发生了意外 两个测试机都找不到设备了 但是 都在充电 还能连接 itune !!!! 我郁闷了 解决办法 是 Mac iTunes 重新 ...
- UIWebView获得内容的高 高度自适应 宽度自适应
UIWebView获得内容的高-作出自适应高的UIWebView- (void)webViewDidFinishLoad:(UIWebView *)webView { NSString *height ...
- XML DTD验证
XML DTD验证 一.什么是DTD 文档类型定义(DTD:Document Type Definition)可定义合法的XML文档构建模块.它使用一系列合法的元素来定义文档的结构. DTD 可被成行 ...
- 瀑布流插件(jquery.masonry.js)
什么是瀑布流?去看看Pinterest(这才是鼻祖),Mark之,蘑菇街,点点网,还有腾讯的微博广场吧.随着页面滚动条向下滚动,还会不断加载数据块并附加至当前尾部. Masonry是一款很好用的jqu ...
- svn配置
svn配置 subverson.conf <Location /svn> DAV svn SVNListParentPath on SVNParentPath /var/repo Auth ...
- HDU 5253 连接的管道 (最小生成树)
连接的管道 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- jQuery选择器之动态列表显示Demo
显示效果: 之后全部展开: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http ...