http://lxr.free-electrons.com/source/drivers/net/8139too.c#L498 在上面的链接 我没有得到的是 结构
static const struct {
const char *name;
u32 version; /* from RTL8139C/RTL8139D docs */
u32 flags;
} rtl_chip_info[] = {
{ "RTL-8139",
HW_REVID(1, 0, 0, 0, 0, 0, 0),
HasHltClk,
},
扩展到
static const struct {
const char *name;
u32 version; /* from RTL8139C/RTL8139D docs */
u32 flags;
} rtl_chip_info[] = {
{ "RTL-8139",
**(b30, b29, b28, b27, b26, b23, b22)
(b30<<30 | b29<<29 | b28<<28 | b27<<27 | b26<<26 | b23<<23 | b22<<22)
(1, 0, 0, 0, 0, 0, 0),**
HasHltClk,
},
我不理解结构声明的上述类型(第2)。
答案 0 :(得分:3)
(b30, b29, b28, b27, b26, b23, b22)
实际上并没有进入代码 - 它们是HW_REVID
宏的参数。换句话说,
HW_REVID(1, 0, 0, 0, 0, 0, 0),
变成
(1<<30 | 0<<29 | 0<<28 | 0<<27 | 0<<26 | 0<<23 | 0<<22)
因为b30
等替换了1, 0,
等等(注意通过替换我的意思是字面上的复制和粘贴)等等。所以说完所有内容后看起来像:
static const struct {
const char *name;
u32 version; /* from RTL8139C/RTL8139D docs */
u32 flags;
} rtl_chip_info[] = {
{ "RTL-8139",
(1<<30 | 0<<29 | 0<<28 | 0<<27 | 0<<26 | 0<<23 | 0<<22), /* originally HW_REVID(1, 0, 0, 0, 0, 0, 0), */
HasHltClk,
}
我不知道你正在使用什么编译器,但是如果你使用gcc,你可以通过-E
开关只做预处理(替换#defines和宏等等)所以你可以看到它正在编译的代码。
答案 1 :(得分:1)
HW_REVID只是在各个位位置30到22中设置1的宏。它被定义为:
#define HW_REVID(b30, b29, b28, b27, b26, b23, b22) \
(b30<<30 | b29<<29 | b28<<28 | b27<<27 | b26<<26 | b23<<23 | b22<<22)
当被称为HW_REVID(1,0,0,0,0,0,0)时,它会扩展为:
(1<<30 | 0<<29 | 0<<28 | 0<<27 | 0<<26 | 0<<23 | 0<<22)
将剩余的1 30个位置(进入位30)初始化为32位版本字段为0x40000000。