好c源码 [已删除]

--------------------------------------------------------------------------------------------------------------------------------------------------------------


--------------------------------------------------------------------------------------------------------------------------------------------------------------

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;
}


 
[plain]  view plain copy
  1.   
[plain]  view plain copy
  1. typedef struct  _CONFIG_PARAMETER  
  2. {  
  3.     U32             uId;  
  4.     U32             uDefValue;  
  5.     NDIS_STRING     szName;  
  6. }   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}
};

[plain]  view plain copy
  1. PCONFIG_PARAMETER C_DM9000::DeviceConfigureParameters(void)  
  2. {  
  3.     return (PCONFIG_PARAMETER)&g_szDm9ConfigParams[0];  
  4. }  


 

 --------------------------------------------------------------------------------

二级指针使用范例

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;  
}  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值