數據結構分析
先來張圖:
- 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
+關注
關注
0文章
14瀏覽量
6282
發布評論請先 登錄
相關推薦
數據結構與算法分析(Java版)(pdf)
數據結構與算法分析(Java版)(pdf)http://www.ibeifeng.com/read.php?tid=4812&u=73481【中文】Java數據結構和算法中文第二
發表于 12-20 21:22
基于公共數據結構的EDA仿真波形分析技術
基于公共數據結構的EDA仿真波形分析技術:現有的EDA仿真工具缺乏對仿真數據的分析處理功能,影響了仿真分析的效率。本文提出一種基于公共波形
發表于 10-23 16:49
?21次下載
C#數據結構和算法分析_ 魏寶剛
《數據結構與算法分析》描述了各種類型的數據結構,包括線性表、樹、堆、圖,以及查找、排序等算法。自始至終將數據結構的基本原理與算法分析緊密結合
發表于 12-15 16:46
?0次下載
數據結構是什么_數據結構有什么用
數據結構是計算機存儲、組織數據的方式。數據結構是指相互之間存在一種或多種特定關系的數據元素的集合。通常情況下,精心選擇的數據結構可以帶來更高
發表于 11-17 14:45
?1.6w次閱讀
什么是數據結構?為什么要學習數據結構?數據結構的應用實例分析
本文檔的主要內容詳細介紹的是什么是數據結構?為什么要學習數據結構?數據結構的應用實例分析包括了:數據結構在串口通信當中的應用,
發表于 09-26 15:45
?14次下載
Linux 內核數據結構:位圖(Bitmap)
除了各種鏈式和樹形數據結構,Linux內核還提供了位圖接口。位圖在Linux內核中大量使用。下面的源代碼文件包含這些結構的通用接口。
發表于 05-14 17:24
?3497次閱讀
你知道Linux內核數據結構中雙向鏈表的作用?
Linux 內核提供一套雙向鏈表的實現,你可以在 include/linux/list.h 中找到。我們以雙向鏈表著手開始介紹 Linux 內核中的數據結構 ,因為這個是在
發表于 05-14 17:27
?1881次閱讀
數據結構與算法分析—C語言描述
《數據結構與算法分析:C語言描述》曾被評為20世紀頂尖的30部計算機著作之一,作者在數據結構和算法分析方面卓有建樹,他的數據結構和算法
發表于 10-14 08:00
?17次下載
Linux內核中使用的數據結構
Linux內核代碼中廣泛使用了數據結構和算法,其中最常用的兩個是鏈表和紅黑樹。 鏈表 Linux內核代碼大量使用了鏈表這種數據結構。鏈表是在解決數組不能動態擴展這個缺陷而產生的一種
評論