挂载cpu总线上的设备单元,一般都会一段线性的地址空间来描述自身,我们该怎么去描述这个设备单元呢?
struct resource 结构就是用来描述一个挂接在cpu总线上的设备实体
vi include/linux/ioport.h 当我们需要创建一个该资源时可以包含此头文件来快捷创建
18 struct resource {
19 resource_size_t start;
20 resource_size_t end;
21 const char *name;
22 unsigned long flags;
23 struct resource *parent, *sibling, *child;
24 };
start表示资源开始的位置,如果是IO地址资源,就是起始物理地址,如果是中断资源,就是中断号;
end表示资源结束的位置,如果是IO地址地址,就是映射的最后一个物理地址,如果是中断资源,就不用填;
name就是这个资源的名字。
flags表示资源类型,提取函数在寻找资源的时候会对比自己传入的参数和这个成员,使用内核提供的宏,这些宏也在"ioport.h"中进行了定义,比如IORESOURCE_MEM表示这个资源是地址资源,IORESOURCE_IRQ表示这个资源是中断资源.....
33 /*
* IO resources have these defined flags.
34 */
35 #define IORESOURCE_BITS 0x000000ff /* Bus-specific bits */
36
37 #define IORESOURCE_TYPE_BITS 0x00001f00 /* Resource type */
38 #define IORESOURCE_IO 0x00000100
39 #define IORESOURCE_MEM 0x00000200
40 #define IORESOURCE_IRQ 0x00000400
41 #define IORESOURCE_DMA 0x00000800
42 #define IORESOURCE_BUS 0x00001000
43
44 #define IORESOURCE_PREFETCH 0x00002000 /* No side effects */
45 #define IORESOURCE_READONLY 0x00004000
46 #define IORESOURCE_CACHEABLE 0x00008000
47 #define IORESOURCE_RANGELENGTH 0x00010000
48 #define IORESOURCE_SHADOWABLE 0x00020000
49
50 #define IORESOURCE_SIZEALIGN 0x00040000 /* size indicates alignment */
51 #define IORESOURCE_STARTALIGN 0x00080000 /* start field is alignment */
52
53 #define IORESOURCE_MEM_64 0x00100000
54 #define IORESOURCE_WINDOW 0x00200000 /* forwarded by bridge */
55 #define IORESOURCE_MUXED 0x00400000 /* Resource is software muxed */
56
57 #define IORESOURCE_EXCLUSIVE 0x08000000 /* Userland may not map this resource */
58 #define IORESOURCE_DISABLED 0x10000000
59 #define IORESOURCE_UNSET 0x20000000
60 #define IORESOURCE_AUTO 0x40000000
61 #define IORESOURCE_BUSY 0x80000000 /* Driver has marked this resource busy *
例:
842 static struct resource da8xx_rtc_resources[] = {
843 {
844 .start = DA8XX_RTC_BASE,
845 .end = DA8XX_RTC_BASE + SZ_4K - 1,
846 .flags = IORESOURCE_MEM,
847 },
848 { /* timer irq */
849 .start = IRQ_DA8XX_RTC,
850 .end = IRQ_DA8XX_RTC,
851 .flags = IORESOURCE_IRQ,
852 },
853 { /* alarm irq */
854 .start = IRQ_DA8XX_RTC,
855 .end = IRQ_DA8XX_RTC,
856 .flags = IORESOURCE_IRQ,
857 },
858 };
DA8XX_RTC_BASE :描述自身的线性起始地址
DA8XX_RTC_BASE + SZ_4K - 1:描述自身的线性结束地址
IRQ_DA8XX_RTC:中断号