内核结构体 resource

挂载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:中断号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值