在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Linux GIC驅動數據結構分析

麥辣雞腿堡 ? 來源:LoyenWang ? 作者:LoyenWang ? 2023-09-28 15:18 ? 次閱讀

數據結構分析

先來張圖:

圖片

  • GIC驅動中,使用struct gic_chip_data結構體來描述GIC控制器的信息,整個驅動都是圍繞著該結構體的初始化,驅動中將函數指針都初始化好,實際的工作是由中斷信號觸發,也就是在中斷來臨的時候去進行回調;
  • struct irq_chip結構,描述的是中斷控制器的底層操作函數集,這些函數集最終完成對控制器硬件的操作;
  • struct irq_domain結構,用于硬件中斷號和Linux IRQ中斷號(virq,虛擬中斷號)之間的映射;

還是上一下具體的數據結構代碼吧,關鍵注釋如下:

struct irq_chip {
	struct device	*parent_device;     //指向父設備
	const char	*name;      //  /proc/interrupts中顯示的名字
	unsigned int	(*irq_startup)(struct irq_data *data);  //啟動中斷,如果設置成NULL,則默認為enable
	void		(*irq_shutdown)(struct irq_data *data);     //關閉中斷,如果設置成NULL,則默認為disable
	void		(*irq_enable)(struct irq_data *data);   //中斷使能,如果設置成NULL,則默認為chip- >unmask
	void		(*irq_disable)(struct irq_data *data);  //中斷禁止


	void		(*irq_ack)(struct irq_data *data);  //開始新的中斷
	void		(*irq_mask)(struct irq_data *data); //中斷源屏蔽
	void		(*irq_mask_ack)(struct irq_data *data); //應答并屏蔽中斷
	void		(*irq_unmask)(struct irq_data *data);   //解除中斷屏蔽
	void		(*irq_eoi)(struct irq_data *data);  //中斷處理結束后調用


	int		(*irq_set_affinity)(struct irq_data *data, const struct cpumask *dest, bool force); //在SMP中設置CPU親和力
	int		(*irq_retrigger)(struct irq_data *data);    //重新發送中斷到CPU
	int		(*irq_set_type)(struct irq_data *data, unsigned int flow_type); //設置中斷觸發類型
	int		(*irq_set_wake)(struct irq_data *data, unsigned int on);    //使能/禁止電源管理中的喚醒功能


	void		(*irq_bus_lock)(struct irq_data *data); //慢速芯片總線上的鎖
	void		(*irq_bus_sync_unlock)(struct irq_data *data);  //同步釋放慢速總線芯片的鎖


	void		(*irq_cpu_online)(struct irq_data *data);
	void		(*irq_cpu_offline)(struct irq_data *data);


	void		(*irq_suspend)(struct irq_data *data);
	void		(*irq_resume)(struct irq_data *data);
	void		(*irq_pm_shutdown)(struct irq_data *data);


	void		(*irq_calc_mask)(struct irq_data *data);


	void		(*irq_print_chip)(struct irq_data *data, struct seq_file *p);
	int		(*irq_request_resources)(struct irq_data *data);
	void		(*irq_release_resources)(struct irq_data *data);


	void		(*irq_compose_msi_msg)(struct irq_data *data, struct msi_msg *msg);
	void		(*irq_write_msi_msg)(struct irq_data *data, struct msi_msg *msg);


	int		(*irq_get_irqchip_state)(struct irq_data *data, enum irqchip_irq_state which, bool *state);
	int		(*irq_set_irqchip_state)(struct irq_data *data, enum irqchip_irq_state which, bool state);


	int		(*irq_set_vcpu_affinity)(struct irq_data *data, void *vcpu_info);


	void		(*ipi_send_single)(struct irq_data *data, unsigned int cpu);
	void		(*ipi_send_mask)(struct irq_data *data, const struct cpumask *dest);


	unsigned long	flags;
};


struct irq_domain {
	struct list_head link;  //用于添加到全局鏈表irq_domain_list中
	const char *name;   //IRQ domain的名字
	const struct irq_domain_ops *ops;   //IRQ domain映射操作函數集
	void *host_data;    //在GIC驅動中,指向了irq_gic_data
	unsigned int flags; 
	unsigned int mapcount;  //映射中斷的個數


	/* Optional data */
	struct fwnode_handle *fwnode;
	enum irq_domain_bus_token bus_token;
	struct irq_domain_chip_generic *gc;
#ifdef	CONFIG_IRQ_DOMAIN_HIERARCHY
	struct irq_domain *parent;  //支持級聯的話,指向父設備
#endif
#ifdef CONFIG_GENERIC_IRQ_DEBUGFS
	struct dentry		*debugfs_file;
#endif


	/* reverse map data. The linear map gets appended to the irq_domain */
	irq_hw_number_t hwirq_max;  //IRQ domain支持中斷數量的最大值
	unsigned int revmap_direct_max_irq;
	unsigned int revmap_size;   //線性映射的大小
	struct radix_tree_root revmap_tree; //Radix Tree映射的根節點
	unsigned int linear_revmap[];   //線性映射用到的查找表
};


struct irq_domain_ops {
	int (*match)(struct irq_domain *d, struct device_node *node,
		     enum irq_domain_bus_token bus_token);      // 用于中斷控制器設備與IRQ domain的匹配
	int (*select)(struct irq_domain *d, struct irq_fwspec *fwspec,
		      enum irq_domain_bus_token bus_token);
	int (*map)(struct irq_domain *d, unsigned int virq, irq_hw_number_t hw);    //用于硬件中斷號與Linux中斷號的映射
	void (*unmap)(struct irq_domain *d, unsigned int virq);
	int (*xlate)(struct irq_domain *d, struct device_node *node,
		     const u32 *intspec, unsigned int intsize,
		     unsigned long *out_hwirq, unsigned int *out_type);     //通過device_node,解析硬件中斷號和觸發方式


#ifdef	CONFIG_IRQ_DOMAIN_HIERARCHY
	/* extended V2 interfaces to support hierarchy irq_domains */
	int (*alloc)(struct irq_domain *d, unsigned int virq,
		     unsigned int nr_irqs, void *arg);
	void (*free)(struct irq_domain *d, unsigned int virq,
		     unsigned int nr_irqs);
	void (*activate)(struct irq_domain *d, struct irq_data *irq_data);
	void (*deactivate)(struct irq_domain *d, struct irq_data *irq_data);
	int (*translate)(struct irq_domain *d, struct irq_fwspec *fwspec,
			 unsigned long *out_hwirq, unsigned int *out_type);
#endif
};
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 控制器
    +關注

    關注

    112

    文章

    16433

    瀏覽量

    178935
  • 嵌入式
    +關注

    關注

    5089

    文章

    19169

    瀏覽量

    306753
  • Linux
    +關注

    關注

    87

    文章

    11335

    瀏覽量

    210086
  • 數據結構
    +關注

    關注

    3

    文章

    573

    瀏覽量

    40187
  • gic
    gic
    +關注

    關注

    0

    文章

    14

    瀏覽量

    6282
收藏 人收藏

    評論

    相關推薦

    數據結構與算法分析(Java版)(pdf)

    數據結構與算法分析(Java版)(pdf)http://www.ibeifeng.com/read.php?tid=4812&u=73481【中文】Java數據結構和算法中文第二
    發表于 12-20 21:22

    數據結構與算法分析

    數據結構與算法分析
    發表于 06-05 10:46

    數據結構與算法分析:C語音第二版

    數據結構與算法分析:C語音第二版,經典資料與你分析
    發表于 12-10 10:57

    基于公共數據結構的EDA仿真波形分析技術

    基于公共數據結構的EDA仿真波形分析技術:現有的EDA仿真工具缺乏對仿真數據分析處理功能,影響了仿真分析的效率。本文提出一種基于公共波形
    發表于 10-23 16:49 ?21次下載

    C#數據結構和算法分析_ 魏寶剛

    數據結構與算法分析》描述了各種類型的數據結構,包括線性表、樹、堆、圖,以及查找、排序等算法。自始至終將數據結構的基本原理與算法分析緊密結合
    發表于 12-15 16:46 ?0次下載
    C#<b class='flag-5'>數據結構</b>和算法<b class='flag-5'>分析</b>_ 魏寶剛

    數據結構是什么_數據結構有什么用

    數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高
    發表于 11-17 14:45 ?1.6w次閱讀
    <b class='flag-5'>數據結構</b>是什么_<b class='flag-5'>數據結構</b>有什么用

    什么是數據結構?為什么要學習數據結構數據結構的應用實例分析

    本文檔的主要內容詳細介紹的是什么是數據結構?為什么要學習數據結構數據結構的應用實例分析包括了:數據結構在串口通信當中的應用,
    發表于 09-26 15:45 ?14次下載
    什么是<b class='flag-5'>數據結構</b>?為什么要學習<b class='flag-5'>數據結構</b>?<b class='flag-5'>數據結構</b>的應用實例<b class='flag-5'>分析</b>

    Linux 內核數據結構:位圖(Bitmap)

    除了各種鏈式和樹形數據結構Linux內核還提供了位圖接口。位圖在Linux內核中大量使用。下面的源代碼文件包含這些結構的通用接口。
    發表于 05-14 17:24 ?3497次閱讀

    你知道Linux內核數據結構中雙向鏈表的作用?

    Linux 內核提供一套雙向鏈表的實現,你可以在 include/linux/list.h 中找到。我們以雙向鏈表著手開始介紹 Linux 內核中的數據結構 ,因為這個是在
    發表于 05-14 17:27 ?1881次閱讀

    Linux0.11-進程控制塊數據結構

    嵌入式Linux中文站收集整理Linux0.11版本內核學習筆記,本文分析Linux進程控制模塊的數據結構
    發表于 05-15 15:22 ?987次閱讀

    數據結構與算法分析—C語言描述

    數據結構與算法分析:C語言描述》曾被評為20世紀頂尖的30部計算機著作之一,作者在數據結構和算法分析方面卓有建樹,他的數據結構和算法
    發表于 10-14 08:00 ?17次下載
    <b class='flag-5'>數據結構</b>與算法<b class='flag-5'>分析</b>—C語言描述

    數據結構與算法分析——Java語言描述

    數據結構與算法分析——Java語言描述說明。
    發表于 05-31 14:25 ?22次下載

    Linux內核的鏈表數據結構

    Linux內核實現了自己的鏈表數據結構,它的設計與傳統的方式不同,非常巧妙也很通用。
    的頭像 發表于 03-24 11:34 ?866次閱讀
    <b class='flag-5'>Linux</b>內核的鏈表<b class='flag-5'>數據結構</b>

    Linux內核代碼中常用的數據結構有哪些?

    Linux內核代碼中廣泛使用了數據結構和算法,其中最常用的兩個是鏈表和紅黑樹。
    發表于 07-20 09:39 ?528次閱讀

    Linux內核中使用的數據結構

    Linux內核代碼中廣泛使用了數據結構和算法,其中最常用的兩個是鏈表和紅黑樹。 鏈表 Linux內核代碼大量使用了鏈表這種數據結構。鏈表是在解決數組不能動態擴展這個缺陷而產生的一種
    的頭像 發表于 11-09 14:24 ?526次閱讀
    <b class='flag-5'>Linux</b>內核中使用的<b class='flag-5'>數據結構</b>
    主站蜘蛛池模板: 欧美式free群乱 | 天天看天天爽天天摸天天添 | 四虎在线永久免费视频网站 | 中文字幕有码视频 | 天堂资源wwww在线看 | 国产午夜大片 | 最好看免费中文字幕2018视频 | 婷婷六月丁香午夜爱爱 | 色秀视频免费高清网站 | 色之综合天天综合色天天棕色 | 亚洲天天综合网 | 深夜视频在线播放视频在线观看免费观看 | 国产精品欧美久久久久天天影视 | 51vv福利视频在线精品 | 国产成人啪午夜精品网站 | 在线观看天堂 | 高清视频黄色录像免费 | 日韩毛片大全 | 精品无码中出一区二区 | 久久瑟 | 人人揉人人爽五月天视频 | 亚洲综合激情九月婷婷 | 综合五月激情 | 国产a一级毛片午夜剧场14 | 5151四虎永久在线精品免费 | 极品色天使在线婷婷天堂亚洲 | 亚洲第一网站 | 欧美成人在线网站 | 毛色毛片免费观看 | 在线亚洲成人 | 六月丁香深爱六月综合激情 | 日本不卡高清视频 | 手机看片国产免费久久网 | 美女被免费视频的网站 | 成人国产永久福利看片 | 天天爱天天干天天操 | 伊人久久亚洲综合天堂 | 亚州 色 图 综合 | 海外毛片| 色婷婷五 | 天天色操|