devices_init ()

来源:互联网 发布:淘宝怎么卖二手手机 编辑:程序博客网 时间:2024/06/06 03:29

参考部分1:http://blog.chinaunix.net/uid-20799298-id-99663.html

参考部分2:uboot源码,uboot版本:1.1.6

PS:还有一些问题没有搞清楚,有问题请指出。个人感觉device的定义、存储、查找有一种数组方法的感觉,个人认为采用链表比较好。

定义链表头:

typedef struct ListStructTag    {    int signature;              /* debugging aid */    int percentIncrease;        /* %of current size to increase by when list is out of space */    int minNumItemsIncrease;    /* fixed number of items to increase by when list is out of space */    int listSize;               /* number of items than can fit in the currently allocated memory */    int itemSize;               /* the size of each item in the list (same for every item) */    int numItems;               /* number of items currently in the list */    unsigned char itemList[1];  /* resizable array of list elements */    } ListStruct;typedef struct ListStructTag **list_t;        /* The list abstract data type */

定义device链表的头。


    int percentIncrease;        /* %of current size to increase by when list is out of space */
    int minNumItemsIncrease;    /* fixed number of items to increase by when list is out of space */

这两个定义不甚懂

int listSize;       //链表中的device个数
int itemSize;       //device的大小
numItems;         //真正的device个数,一般情况下,两个变量相等。在创建空间时先增加listsize,增加device后增加itemsize。
unsigned char itemList[1]; 指针指向device

 handlerecord:ptr指向设备链,size标记大小。

    typedef struct
    {
        void            *ptr;
        unsigned int    size;
    } HandleRecord;



定义device结构体:设备结构体包含设备名字,设备标记、一些借口函数。

/* Device information */typedef struct {intflags;/* Device flags: input/output/system*/intext;/* Supported extensions*/charname[16];/* Device name*//* GENERAL functions */int (*start) (void);/* To start the device*/int (*stop) (void);/* To stop the device*//* OUTPUT functions */void (*putc) (const char c);/* To put a char*/void (*puts) (const char *s);/* To put a string (accelerator)*//* INPUT functions */int (*tstc) (void);/* To test if a char is ready...*/int (*getc) (void);/* To get that char*//* Other functions */void *priv;/* Private extensions*/} device_t;

  定义

int devices_init (void){#ifndef CONFIG_ARM     /* already relocated for current ARM implementation */ulong relocation_offset = gd->reloc_off;int i;/* relocate device name pointers */for (i = 0; i < (sizeof (stdio_names) / sizeof (char *)); ++i) {stdio_names[i] = (char *) (((ulong) stdio_names[i]) +relocation_offset);}#endif/* Initialize the list */devlist = ListCreate (sizeof (device_t));if (devlist == NULL) {eputs ("Cannot initialize the list of devices!\n");return -1;}

分析:
#ifndef CONFIG_ARM   没有定义不运行。

devlist = ListCreate (sizeof (device_t));

函数运行的结构结构可以在引用1中看到,建立空链表。并建立一个HandleRecord,指向liststruct。通过函数返回给全局变量devlist.


                      HandleRecord            ListStruct

+-----------+        +-----------------+         +-----------------------------+
|           | -----> | ListStruct *ptr | ------> | signature = LIST_SIGNATURE  |
+-----------+        +-----------------+         +-----------------------------+
void **hanPtr        |   size          |         | percentIncrease = 10        |
     |               +-----------------+         +-----------------------------+
     v return from NewHandle()                   | minNumItemsIncrease =4      |
list_t list                                      +-----------------------------+
     |                                           | listSize = 0                |
     v return from ListCreate()                  +-----------------------------+
list_t devlist                                   | itemSize = sizeof(device_t) |
                                                 +-----------------------------+
                                                 | numItems = 0               |     
                                                 +-----------------------------+
                                                 | unsigned char itemList[1]   |
                                                 +-----------------------------+     

                                     device      | device0  |
                                                 +-----------------------------+

                                                 +-----------------------------+     

                                     device      | device1
                                                 +-----------------------------+

}#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)i2c_init (CFG_I2C_SPEED, CFG_I2C_SLAVE);#endif#ifdef CONFIG_LCDdrv_lcd_init ();#endif#if defined(CONFIG_VIDEO) || defined(CONFIG_CFB_CONSOLE)drv_video_init ();#endif#ifdef CONFIG_KEYBOARDdrv_keyboard_init ();#endif#ifdef CONFIG_LOGBUFFERdrv_logbuff_init ();#endifdrv_system_init ();#ifdef CONFIG_SERIAL_MULTIserial_devices_init ();#endif#ifdef CONFIG_USB_TTYdrv_usbtty_init ();#endif#ifdef CONFIG_NETCONSOLEdrv_nc_init ();#endifreturn (0);}
程序:
#if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)i2c_init (CFG_I2C_SPEED, CFG_I2C_SLAVE);#endif#ifdef CONFIG_LCDdrv_lcd_init ();#endif#if defined(CONFIG_VIDEO) || defined(CONFIG_CFB_CONSOLE)drv_video_init ();#endif#ifdef CONFIG_KEYBOARDdrv_keyboard_init ();#endif#ifdef CONFIG_LOGBUFFERdrv_logbuff_init ();#endifdrv_system_init ();#ifdef CONFIG_SERIAL_MULTIserial_devices_init ();#endif#ifdef CONFIG_USB_TTYdrv_usbtty_init ();#endif#ifdef CONFIG_NETCONSOLEdrv_nc_init ();#endifreturn (0);}
分析:根据板子设置,是否需要一些设备,如果需要简历这些设备并增加到设备链中。韦东山的uboot中没有用到这些定义,直接运行
drv_system_init ();
这个函数主要进行串口设备增加,并将串口设备增加链表中。
* SYSTEM DRIVERS ************************************************************************** */static void drv_system_init (void){device_t dev;memset (&dev, 0, sizeof (dev));strcpy (dev.name, "serial");dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM;#ifdef CONFIG_SERIAL_SOFTWARE_FIFOdev.putc = serial_buffered_putc;dev.puts = serial_buffered_puts;dev.getc = serial_buffered_getc;dev.tstc = serial_buffered_tstc;#elsedev.putc = serial_putc;dev.puts = serial_puts;dev.getc = serial_getc;dev.tstc = serial_tstc;#endifdevice_register (&dev);#ifdef CFG_DEVICE_NULLDEVmemset (&dev, 0, sizeof (dev));strcpy (dev.name, "nulldev");dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM;dev.putc = nulldev_putc;dev.puts = nulldev_puts;dev.getc = nulldev_input;dev.tstc = nulldev_input;device_register (&dev);#endif}

分析:前面主要是建立一个串口设备,并对串口设备进行初始化。最后通过函数
device_register (&dev);增加到设备链中。主要通过函数
int ListInsertItems (list_t list, void *ptrToItems, int firstItemPosition,     int numItemsToInsert)。将增加的device放到设备链的后边。
还有一个关于device的函数,设备搜索。
  1. /* search a device */  
  2. device_t *search_device (int flags, char *name)  
  3. {  
  4.     int i, items;  
  5.     device_t *dev = NULL;  
  6.   
  7.     items = ListNumItems (devlist);  
  8.     if (name == NULL)  
  9.         return dev;  
  10.   
  11.     for (i = 1; i <= items; i++) {  
  12.         dev = ListGetPtrToItem (devlist, i);  
  13.         if ((dev->flags & flags) && (strcmp (name, dev->name) == 0)) {  
  14.             break;  
  15.         }  
  16.     }  
  17.     return dev;  
  18. }  


   



原创粉丝点击