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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM