--------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------
struct eth_device *dev;
memset(dev, 0, sizeof(*dev));
--------------------------------------------------------------------------------------------------------------------------------------------------------------
指针类型转换. 当 对一个常数进行指针类型强制类型转换,相当于 定义一个指针p,指针的值为这个常数. *p代表这个常数为地址上的值.
利用这个原理,可以对寄存器进行读写.
#define HW_IOMUXC_SW_MUX_CTL_PAD_GPIO00 (*(volatile hw_iomux_t *) GPIO_ADDR)
#define HW_IOMUXC_SW_MUX_CTL_PAD_GPIO00_RD() (HW_IOMUXC_SW_MUX_CTL_PAD_GPIO00.U)
#define HW_IOMUXC_SW_MUX_CTL_PAD_GPIO00_WR(v) (HW_IOMUXC_SW_MUX_CTL_PAD_GPIO00.U = (v))
typedef union _hw_iomux_t
{
reg32_t U;
struct _hw_iomuxc_sw_mux_ctl_pad_gpio00_bitfields
{
unsigned MUX_MODE : 3; //!< [2:0] MUX Mode Select Field.
unsigned RESERVED0 : 1; //!< [3] Reserved
unsigned SION : 1; //!< [4] Software Input On Field.
unsigned RESERVED1 : 27; //!< [31:5] Reserved
} B;
} hw_iomuxc_t;
返回结构体typ的成员member的偏移量
(unsigned long) (&((type *)0)->member)
1.1关于指针读数据的2种方式
a:读之前指针已经初始化好了,然后去读,
b:读之前指针没有指向一个全局缓冲然后去读.
对于第一种很简单:
char *getenv(const char *name)
{
name=&Globan_Buffer[0];
readEnv(name);
retrun name;
}
//对于第二种应该是这样的:
char *getenv(const char *name)
{
ENTRY *ep;
readSubEnv(&ep);
return ep ? ep->data : NULL;
}
1:关于结构体初始化
struct nand_ecclayout {
uint32_t eccbytes;
uint32_t eccpos[128];
uint32_t oobavail;
struct nand_oobfree oobfree[MTD_MAX_OOBFREE_ENTRIES];
};
static struct nand_ecclayout nand_oob_16 = {
.eccbytes = 6,
.eccpos = {0, 1, 2, 3, 6, 7},
.oobfree = {
{.offset = 8,
. length = 8}}
};
2:关于结构体数组的遍历
PCONFIG_PARAMETER pconfig;
PNDIS_CONFIGURATION_PARAMETER param;
for( pconfig=DeviceConfigureParameters(); (pconfig->uId != (U32)-1); pconfig++)
{
NdisReadConfiguration(
&status,
¶m,
hConfig,
&(pconfig->szName),
NdisParameterHexInteger);
if(status == NDIS_STATUS_SUCCESS)
m_szConfigures[pconfig->uId] =
param->ParameterData.IntegerData;
else
m_szConfigures[pconfig->uId] = pconfig->uDefValue;
}
- typedef struct _CONFIG_PARAMETER
- {
- U32 uId;
- U32 uDefValue;
- NDIS_STRING szName;
- } CONFIG_PARAMETER, *PCONFIG_PARAMETER;
CONFIG_PARAMETER g_szDm9ConfigParams[] =
{
{ CID_CONNECTION_TYPE, -1, NDIS_STRING_CONST("ConnectionType") },
{ CID_SLOT_NUMBER, -1, NDIS_STRING_CONST("SlotNumber")},
{ CID_BUFFER_PHYSICAL_ADDRESS, 0, NDIS_STRING_CONST("BufferPhysicalAddress")},
{ CID_TXBUFFER_NUMBER, 0x20, NDIS_STRING_CONST("XmitBuffer")},
{ CID_RXBUFFER_NUMBER, 0x10, NDIS_STRING_CONST("RecvBuffer")},
{ CID_ADAPTER_NUMBER, 0, NDIS_STRING_CONST("AdapterNumber")},
{ CID_IO_BASE_ADDRESS, 0x18000300, NDIS_STRING_CONST("IoAddress")},
{ CID_IO_RANGE, 0x10, NDIS_STRING_CONST("IoRange")},
{ CID_IRQ_NUMBER, 0x1A, NDIS_STRING_CONST("IrqNumber")},
{ -1,-1,NULL}
};
- PCONFIG_PARAMETER C_DM9000::DeviceConfigureParameters(void)
- {
- return (PCONFIG_PARAMETER)&g_szDm9ConfigParams[0];
- }
--------------------------------------------------------------------------------
二级指针使用范例
static struct platform_device *mini2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_rtc,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&mini2440_device_eth,
&s3c24xx_uda134x,
&s3c_device_nand,
&s3c_device_sdi,
&s3c_device_usbgadget,
};
platform_add_devices(mini2440_devices, ARRAY_SIZE(mini2440_devices));
int platform_add_devices(struct platform_device **devs, int num)
{
int i, ret = 0;
for (i = 0; i < num; i++) {
ret = platform_device_register(devs[i]);
if (ret) {
while (--i >= 0)
platform_device_unregister(devs[i]);
break;
}
}
return ret;
}