Boot的设备管理框架

一、U-Boot的设备管理框架

在《U-Boot的设备管理》一文中通过源码分析讲解了U-Boot的设备管理。本文将从宏观的角度继续讲解U-Boot的设备管理框架。设备管理框架实现了设备的高度抽象,保持框架的稳定性,允许框架下的代码实时变化,可以很好的实现U-Boot的驱动程序的移植。U-Boot的设备管理框架实现了对串口、LCD、键盘、usbtty、I2C等设备的抽象。

 

U-Boot源代码下载地址

框架的编写不同于写代码,需要对具体设备实例进行高度抽象。对于上面提到的一些设备,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框架。有的时候,有些设备可能不需要或没有必要进行打开和释放,对于这样的设备,设备的打开和释放操作就可以省略掉。同样有些设备可能是只读的或只写的,只需从中读取数据即可,不需要进行数据的写入等操作。下面我们来具体看一下这个框架。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wywwfp.html