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]; 指针指向devicehandlerecord: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的函数,设备搜索。
- /* search a device */
- device_t *search_device (int flags, char *name)
- {
- int i, items;
- device_t *dev = NULL;
- items = ListNumItems (devlist);
- if (name == NULL)
- return dev;
- for (i = 1; i <= items; i++) {
- dev = ListGetPtrToItem (devlist, i);
- if ((dev->flags & flags) && (strcmp (name, dev->name) == 0)) {
- break;
- }
- }
- return dev;
- }
- devices_init
- devices_init ()
- devices_init ()函数分析
- 拼多多-最大乘积-c/c++
- 修改记事本默认编码为UTF-8
- 动态规划DP
- weiphp 2.0创建application目录插件,却访问不了的问题
- Android中PopupWindow响应返回键并关闭
- devices_init ()
- Sigmod/Softmax变换
- Android Studio混淆方法
- CMenu类中禁用-变灰某一项
- 时钟
- VEGAS Pro 15 Suite下载 v15.177中文版
- ARM常用概念与FAQ
- 【拼多多笔试题】小熊战斗力
- linux上安装nginx,启动及停止