再谈U-Boot的设备管理框架

2024-08-28 11:58
文章标签 管理 框架 boot 设备 再谈

本文主要是介绍再谈U-Boot的设备管理框架,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

再谈U-Boot的设备管理框架


转载自 http://blog.csdn.net/ce123_zhouwei/article/details/7357045

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

在《U-Boot的设备管理》一文中通过源码分析讲解了U-Boot的设备管理。本文将从宏观的角度继续讲解U-Boot的设备管理框架。设备管理框架实现了设备的高度抽象,保持框架的稳定性,允许框架下的代码实时变化,可以很好的实现U-Boot的驱动程序的移植。U-Boot的设备管理框架实现了对串口、LCD、键盘、usbtty、I2C等设备的抽象。
框架的编写不同于写代码,需要对具体设备实例进行高度抽象。对于上面提到的一些设备,U-Boot针对他们的操作方法抽象抽象为四种类型
  • 设备的启动操作
  • 设备的释放操作
  • 数据写向设备的操作
  • 数据从设备中读出的操作
设备的初始化操作作为单独的一个函数,供外部调用,以实现设备的初始化并注册设备。例如U-Boot中devices_init函数通过调用各个设备的初始化函数对设备进行初始化,在各个设备的初始化函数中将设备进行注册。
[plain]  view plain copy
print ?
  1. int devices_init (void)  
  2. {  
  3. #ifndef CONFIG_ARM     /* already relocated for current ARM implementation */  
  4.     ulong relocation_offset = gd->reloc_off;  
  5.     int i;  
  6.   
  7.     /* relocate device name pointers */  
  8.     for (i = 0; i < (sizeof (stdio_names) / sizeof (char *)); ++i) {  
  9.         stdio_names[i] = (char *) (((ulong) stdio_names[i]) +  
  10.                         relocation_offset);  
  11.     }  
  12. #endif  
  13.   
  14.     /* Initialize the list */  
  15.     devlist = ListCreate (sizeof (device_t));//创建设备列表  
  16.   
  17.     if (devlist == NULL) {  
  18.         eputs ("Cannot initialize the list of devices!\n");  
  19.         return -1;  
  20.     }  
  21. #if defined(CONFIG_HARD_I2C) || defined(CONFIG_SOFT_I2C)  
  22.     i2c_init (CFG_I2C_SPEED, CFG_I2C_SLAVE);//初始化i2c接口,i2c没有注册到devlist中去  
  23. #endif  
  24. #ifdef CONFIG_LCD  
  25.     drv_lcd_init ();   //初始化LCD设备  
  26. #endif  
  27. #if defined(CONFIG_VIDEO) || defined(CONFIG_CFB_CONSOLE)  
  28.     drv_video_init ();   //初始化video设备  
  29. #endif  
  30. #ifdef CONFIG_KEYBOARD  
  31.     drv_keyboard_init ();  //初始化键盘设备  
  32. #endif  
  33. #ifdef CONFIG_LOGBUFFER  
  34.     drv_logbuff_init ();   //初始化logbuff设备  
  35. #endif  
  36.     drv_system_init ();//这里其实是定义了一个串口设备,并且注册到devlist中  
  37. #ifdef CONFIG_SERIAL_MULTI  
  38.     serial_devices_init ();  //初始化serial设备  
  39. #endif  
  40. #ifdef CONFIG_USB_TTY  
  41.     drv_usbtty_init ();  //usbtty设备  
  42. #endif  
  43. #ifdef CONFIG_NETCONSOLE  
  44.     drv_nc_init ();  
  45. #endif  
  46.   
  47.     return (0);  
  48. }  
U-Boot的这套设备管理框架并没有实现都所有的设备的抽象,像Flash设备使用的就是MTD框架。有的时候,有些设备可能不需要或没有必要进行打开和释放,对于这样的设备,设备的打开和释放操作就可以省略掉。同样有些设备可能是只读的或只写的,只需从中读取数据即可,不需要进行数据的写入等操作。下面我们来具体看一下这个框架。
[plain]  view plain copy
print ?
  1. /* Device information */  
  2. typedef struct {  
  3.     int flags;          /* Device flags: input/output/system    */  
  4.     int ext;            /* Supported extensions         */  
  5.     char    name[16];       /* Device name  设备名称            */  
  6.   
  7. /* GENERAL functions 启动和停止函数 */  
  8.   
  9.     int (*start) (void);        /* To start the device          */  
  10.     int (*stop) (void);     /* To stop the device           */  
  11.   
  12. /* OUTPUT functions 输出函数 */  
  13.   
  14.     void (*putc) (const char c);    /* To put a char            */  
  15.     void (*puts) (const char *s);   /* To put a string (accelerator)    */  
  16.   
  17. /* INPUT functions  输入函数*/  
  18.   
  19.     int (*tstc) (void);     /* To test if a char is ready...    */  
  20.     int (*getc) (void);     /* To get that char         */  
  21.   
  22. /* Other functions */  
  23.   
  24.     void *priv;         /* Private extensions           */  
  25. } device_t;  
U-Boot将所有的设备结构体组成一个链表:
list_t devlist = 0;
devlist = ListCreate (sizeof (device_t));
再来看一些函数:
device_register (device_t * dev) 设备注册,将结构体添加到devlist的后面
device_deregister(char *devname)
search_device (int flags, char *name) 设备搜索
device_deregister(char *devname)设备的移除
以上这些就过程了U-Boot的设别管理框架。下面来分析一个该框架下的设备实例。

二、串口设备实例简析

drv_system_init 函数初始化串口设备,请看下面的源码:
[plain]  view plain copy
print ?
  1. static void drv_system_init (void)  
  2. {  
  3.     device_t dev;//定义一个结构体  
  4.   
  5.     memset (&dev, 0, sizeof (dev));//为刚刚定义的结构体分配内存  
  6.   
  7.     strcpy (dev.name, "serial");//名称  
  8.     dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM;   
  9.   
  10. #ifdef CONFIG_SERIAL_SOFTWARE_FIFO  
  11.     dev.putc = serial_buffered_putc;  
  12.     dev.puts = serial_buffered_puts;  
  13.     dev.getc = serial_buffered_getc;  
  14.     dev.tstc = serial_buffered_tstc;  
  15. #else  
  16.     dev.putc = serial_putc;//使用的是部分代码,下面这四个函数都是和具体平台的UART控制器相关的代码,下面我们会具体分析一个函数  
  17.     dev.puts = serial_puts;  
  18.     dev.getc = serial_getc;  
  19.     dev.tstc = serial_tstc;  
  20. #endif  
  21.   
  22.     device_register (&dev);//注册函数  
  23.   
  24. #ifdef CFG_DEVICE_NULLDEV  
  25.     memset (&dev, 0, sizeof (dev));  
  26.   
  27.     strcpy (dev.name, "nulldev");  
  28.     dev.flags = DEV_FLAGS_OUTPUT | DEV_FLAGS_INPUT | DEV_FLAGS_SYSTEM;  
  29.     dev.putc = nulldev_putc;  
  30.     dev.puts = nulldev_puts;  
  31.     dev.getc = nulldev_input;  
  32.     dev.tstc = nulldev_input;  
  33.   
  34.     device_register (&dev);  
  35. #endif  
  36. }  
下面我们分析serial_getc函数,其他的函数是类似的。该函数定义在cpu/arm920t/s3c24x0/serial.c文件,从这个路径我们就可以看出这是一个和处理器/平台相关的函数
[plain]  view plain copy
print ?
  1. /*  
  2.  * Read a single byte from the serial port. Returns 1 on success, 0  
  3.  * otherwise. When the function is succesfull, the character read is  
  4.  * written into its argument c.  
  5.  */  
  6. int serial_getc (void)//接收字符  
  7. {  
  8.     S3C24X0_UART * const uart = S3C24X0_GetBase_UART(UART_NR);//获得UART的寄存器结构体  
  9.   
  10.     /* wait for character to arrive */  
  11.     while (!(uart->UTRSTAT & 0x1));//判断状态寄存器的第0位是否为1  
  12.   
  13.     return uart->URXH & 0xff;  
  14. }  

三、小结

U-Boot的设备管理框架比较的简单,但我们可以从中学习到一些框架和分层的思想。

这篇关于再谈U-Boot的设备管理框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1114700

相关文章

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

Spring Boot基于 JWT 优化 Spring Security 无状态登录实战指南

《SpringBoot基于JWT优化SpringSecurity无状态登录实战指南》本文介绍如何使用JWT优化SpringSecurity实现无状态登录,提高接口安全性,并通过实际操作步骤... 目录Spring Boot 实战:基于 JWT 优化 Spring Security 无状态登录一、先搞懂:为什

Spring Boot 集成 mybatis核心机制

《SpringBoot集成mybatis核心机制》这篇文章给大家介绍SpringBoot集成mybatis核心机制,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值... 目录Spring Boot浅析1.依赖管理(Starter POMs)2.自动配置(AutoConfigu

Spring Boot/Spring MVC核心注解的作用详解

《SpringBoot/SpringMVC核心注解的作用详解》本文详细介绍了SpringBoot和SpringMVC中最常用的15个核心注解,涵盖了请求路由映射、参数绑定、RESTfulAPI、... 目录一、Spring/Spring MVC注解的核心作用二、请求映射与RESTful API注解系列2.1

Elasticsearch 的索引管理与映射配置实战指南

《Elasticsearch的索引管理与映射配置实战指南》在本文中,我们深入探讨了Elasticsearch中索引与映射的基本概念及其重要性,通过详细的操作示例,我们了解了如何创建、更新和删除索引,... 目录一、索引操作(一)创建索引(二)删除索引(三)关闭索引(四)打开索引(五)索引别名二、映射操作(一

Spring Boot整合Redis注解实现增删改查功能(Redis注解使用)

《SpringBoot整合Redis注解实现增删改查功能(Redis注解使用)》文章介绍了如何使用SpringBoot整合Redis注解实现增删改查功能,包括配置、实体类、Repository、Se... 目录配置Redis连接定义实体类创建Repository接口增删改查操作示例插入数据查询数据删除数据更

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

idea+spring boot创建项目的搭建全过程

《idea+springboot创建项目的搭建全过程》SpringBoot是Spring社区发布的一个开源项目,旨在帮助开发者快速并且更简单的构建项目,:本文主要介绍idea+springb... 目录一.idea四种搭建方式1.Javaidea命名规范2JavaWebTomcat的安装一.明确tomcat

Spring Boot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)

《SpringBoot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)》本文将以一个实际案例(用户管理系统)为例,详细解析SpringBoot中Co... 目录引言:为什么学习Spring Boot分层架构?第一部分:Spring Boot的整体架构1.1

在Node.js中使用.env文件管理环境变量的全过程

《在Node.js中使用.env文件管理环境变量的全过程》Node.js应用程序通常依赖于环境变量来管理敏感信息或配置设置,.env文件已经成为一种流行的本地管理这些变量的方法,本文将探讨.env文件... 目录引言为什么使php用 .env 文件 ?如何在 Node.js 中使用 .env 文件最佳实践引