当前位置: 代码迷 >> 综合 >> 内核结构体 resource
  详细解决方案

内核结构体 resource

热度:4   发布时间:2024-01-24 08:22:49.0

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

  相关解决方案