zynq linux 驱动之中断相关
Vivado 2016.4
linux版本和从官网获取的2016.4的kernel uboot ramdisk 官网提供的
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
最近在搞zynq linux下的dma驱动,写个笔记记录一下;
1.创建/dev下的节点,有手动创建和程序自动创建两种方式,采用自动创建的方式注意驱动初始化里有没有create_device这个函数。
2.platform驱动模型,详细内容参考链接中的内容,我的理解是对于像PCIE、USB、SPI这类标准总线协议,内核中已经有了相应的框架来描述,
但是对于其他一些不是标准的总线协议,linux引入了一套虚拟总线来统一框架模型,即platform总线模型; platform模型驱动编程,
需要实现platform_device(设备)与platform_driver(驱动)在platform(虚拟总线)上的注册、匹配,相互绑定。因此分platform device和platform driver两个东西需要驱动工程师去实现。
device去描述设备的信息;driver去实现驱动的细节,通过platform模型去获取device的信息。
linux 2.6以前驱动模型是驱动程序中包含了device的信息,因此不能很好的做分层。但是较为简单的驱动用这种方式实现比较清晰,简单,明了一些。
3.zynq linux中断,关于中断的处理流程其实是标准的,但是值得注意的是4.0(具体哪个版本待考证)以后的中断号和硬件中断ID的映射关系不是简单的对应关系了。在官网搜索实例的时候
搜到了一个老的驱动(https://www.xilinx.com/support/answers/62363.html),按照例子试了半天也不行,不知所以然。后来用了另一个platfom的实例(http://www.zynqnotes.com/linux-irq-mapping)
成功了以后才发现原来这两个ID不对应,一搜索果然新版本修改了对应关系。
注意点:在设备树中添加中断信息, request_irq的第一个参数注意对应关系。
使用的硬件block design框图如下所示:
其实很简单,例化一个axi_timer 默认配置,将interrupt连接至ZYNQ的IRQ_F2P,配置连接到GP口,分配地址;
驱动实例参考链接:http://www.zynqnotes.com/linux-irq-mapping
如果和我一样不想用platform驱动模型,那在module_init函数里通过如下两个函数获取中断号,然后request_irq进行注册,前提是设备树中已经添加了中断信息。
#include <linux/of_irq.h>
#include <linux/of.h>
struct device_node* pdev_node;
unsigned int dev_irqnum;
pdev_node = of_find_compatible_node(NULL, NULL, "ricky,xps-timer-1.00.a");
dev_irqnum = irq_of_parse_and_map(pdev_node, i);
request_irq(dev_irqnum, irq_isr0, IRQF_TRIGGER_HIGH, DRV_NAME, NULL);
这样就能获取到设备树中的中断号了。
所有参考链接如下:
http://www.voidcn.com/article/p-nudbneml-ws.html
http://www.voidcn.com/article/p-scfffgqt-uk.html
http://www.wowotech.net/linux_kenrel/dma_controller_driver.html
https://blog.csdn.net/heliangbin87/article/details/81530448
https://blog.csdn.net/W1107101310/article/details/80085382
https://blog.csdn.net/qq_38880380/article/details/79227760
https://www.cnblogs.com/dyllove98/archive/2013/07/03/3170178.html
https://blog.csdn.net/zqixiao_09/article/details/50888795
https://blog.csdn.net/zqixiao_09/article/details/50858776
https://blog.csdn.net/zqixiao_09/article/details/50839042
https://www.cnblogs.com/ylsm-kb/p/9062246.html
https://yq.aliyun.com/articles/10548
https://www.xilinx.com/support/answers/62363.html
http://www.zynqnotes.com/linux-irq-mapping
http://www.wowotech.net/irq_subsystem/request_threaded_irq.html
http://www.wowotech.net/linux_kenrel/interrupt_descriptor.html
https://community.nxp.com/thread/332183
http://blog.51cto.com/heipi/1166243