一、U-Boot的设备管理框架
在《U-Boot的设备管理》一文中通过源码分析讲解了U-Boot的设备管理。本文将从宏观的角度继续讲解U-Boot的设备管理框架。设备管理框架实现了设备的高度抽象,保持框架的稳定性,允许框架下的代码实时变化,可以很好的实现U-Boot的驱动程序的移植。U-Boot的设备管理框架实现了对串口、LCD、键盘、usbtty、I2C等设备的抽象。
框架的编写不同于写代码,需要对具体设备实例进行高度抽象。对于上面提到的一些设备,U-Boot针对他们的操作方法抽象抽象为四种类型
设备的启动操作 设备的释放操作 数据写向设备的操作 数据从设备中读出的操作
设备的初始化操作作为单独的一个函数,供外部调用,以实现设备的初始化并注册设备。例如U-Boot中devices_init函数通过调用各个设备的初始化函数对设备进行初始化,在各个设备的初始化函数中将设备进行注册。
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; } #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C) i2c_init (CFG_I2C_SPEED, CFG_I2C_SLAVE);//初始化i2c接口,i2c没有注册到devlist中去 #endif #ifdef CONFIG_LCD drv_lcd_init (); //初始化LCD设备 #endif #if defined(CONFIG_VIDEO) || defined(CONFIG_CFB_CONSOLE) drv_video_init (); //初始化video设备 #endif #ifdef CONFIG_KEYBOARD drv_keyboard_init (); //初始化键盘设备 #endif #ifdef CONFIG_LOGBUFFER drv_logbuff_init (); //初始化logbuff设备 #endif drv_system_init ();//这里其实是定义了一个串口设备,并且注册到devlist中 #ifdef CONFIG_SERIAL_MULTI serial_devices_init (); //初始化serial设备 #endif #ifdef CONFIG_USB_TTY drv_usbtty_init (); //usbtty设备 #endif #ifdef CONFIG_NETCONSOLE drv_nc_init (); #endif return (0); }
U-Boot的这套设备管理框架并没有实现都所有的设备的抽象,像Flash设备使用的就是MTD框架。有的时候,有些设备可能不需要或没有必要进行打开和释放,对于这样的设备,设备的打开和释放操作就可以省略掉。同样有些设备可能是只读的或只写的,只需从中读取数据即可,不需要进行数据的写入等操作。下面我们来具体看一下这个框架。