挂载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 0x0000010039 #define IORESOURCE_MEM 0x0000020040 #define IORESOURCE_IRQ 0x0000040041 #define IORESOURCE_DMA 0x0000080042 #define IORESOURCE_BUS 0x0000100043 44 #define IORESOURCE_PREFETCH 0x00002000 /* No side effects */45 #define IORESOURCE_READONLY 0x0000400046 #define IORESOURCE_CACHEABLE 0x0000800047 #define IORESOURCE_RANGELENGTH 0x0001000048 #define IORESOURCE_SHADOWABLE 0x0002000049 50 #define IORESOURCE_SIZEALIGN 0x00040000 /* size indicates alignment */51 #define IORESOURCE_STARTALIGN 0x00080000 /* start field is alignment */52 53 #define IORESOURCE_MEM_64 0x0010000054 #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 0x1000000059 #define IORESOURCE_UNSET 0x2000000060 #define IORESOURCE_AUTO 0x4000000061 #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:中断号