U-Boot的设备管理
目录
一、初始设备链表、初始化设备和注册设备
1.1 devices_init函数
1.2 devices结构的定义
1.3 drv_system_init 函数
二、设备注册
2.1 device_register (device_t * dev)
2.2 device_deregister(char *devname)
三、设备搜索
U-Boot通过devices_init函数创建设备链表,然后在devices_init函数中初始化设备并将设备添加到设备链表中。U-Boot使用devices_t结构体来管理设备,设备链表也就是devices_t结构体的链表。通过i2c_init、drv_lcd_init、drv_video_init、drv_keyboard_init、drv_logbuff_init、drv_system_init、serial_devices_init、drv_usbtty_init和drv_nc_init函数初始化设备(这些函数是否执行是通过宏来决定的),并通过device_register函数注册设备。
一、初始设备链表、初始化设备和注册设备
U-Boot在第二阶段中通过devices_init函数创建设备链表,初始化设备并将其注册到设备链表中。该函数在common/devices.c文件中,其对应的头文件是nclude/devices.h。
1.1 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 ();
#endif
#if defined(CONFIG_VIDEO) || defined(CONFIG_CFB_CONSOLE)
drv_video_init ();
#endif
#ifdef CONFIG_KEYBOARD
drv_keyboard_init ();
#endif
#ifdef CONFIG_LOGBUFFER
drv_logbuff_init ();
#endif
drv_system_init ();//这里其实是定义了一个串口设备,并且注册到devlist中
#ifdef CONFIG_SERIAL_MULTI
serial_devices_init ();
#endif
#ifdef CONFIG_USB_TTY
drv_usbtty_init ();
#endif
#ifdef CONFIG_NETCONSOLE
drv_nc_init ();
#endif
return (0);
}
经过devices_init(),创建了devlist,但是只有一个串口设备注册在内。
1.2 devices结构的定义
/* Device information */
typedef struct {
int flags; /* Device flags: input/output/system */
int ext; /* Supported extensions */
char name[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;
1.3 drv_system_init 函数
drv_system_init 函数初始化串口设备,源码如下:
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_FIFO
dev.putc = serial_buffered_putc;
dev.puts = serial_buffered_puts;
dev.getc = serial_buffered_getc;
dev.tstc = serial_buffered_tstc;
#else
dev.putc = serial_putc;
dev.puts = serial_puts;
dev.getc = serial_getc;
dev.tstc = serial_tstc;
#endif
device_register (&dev);//注册函数
#ifdef CFG_DEVICE_NULLDEV
memset (&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
}
二、设备注册
有连个设备注册函数,一个的参数时devces结构体,另一个的参数是设备的名称
2.1device_register (device_t * dev)
设备注册,将结构体添加到devlist的后面,device_register函数的源码如下:
int device_register (device_t * dev)
{
ListInsertItem (devlist, dev, LIST_END);
return 0;
}
/*******************************/
/*
* returns 1 if the item is inserted, returns 0 if out of memory or
* bad arguments were passed.
*/
int ListInsertItem (list_t list, void *ptrToItem, int itemPosition)
{
return ListInsertItems (list, ptrToItem, itemPosition, 1);
}
/*******************************/
int ListInsertItems (list_t list, void *ptrToItems, int firstItemPosition,
int numItemsToInsert)
{
int numItems = (*list)->numItems;
if (firstItemPosition == numItems + 1)
firstItemPosition = LIST_END;
else if (firstItemPosition > numItems)
return 0;
if ((*list)->numItems >= (*list)->listSize) {
if (!ExpandListSpace (list, -numItemsToInsert))
return 0;
}
if (firstItemPosition == LIST_START) {
if (numItems == 0) {
/* special case for empty list */
firstItemPosition = LIST_END;
} else {
firstItemPosition = 1;
}
}
if (firstItemPosition == LIST_END) { /* add at the end of the list */
if (ptrToItems)
memcpy (ITEMPTR (list, numItems), ptrToItems,
(*list)->itemSize * numItemsToInsert);
else
memset (ITEMPTR (list, numItems), 0,
(*list)->itemSize * numItemsToInsert);
(*list)->numItems += numItemsToInsert;
} else { /* move part of list up to make room for new item */
memmove (ITEMPTR (list, firstItemPosition - 1 + numItemsToInsert),
ITEMPTR (list, firstItemPosition - 1),
(numItems + 1 - firstItemPosition) * (*list)->itemSize);
if (ptrToItems)
memmove (ITEMPTR (list, firstItemPosition - 1), ptrToItems,
(*list)->itemSize * numItemsToInsert);
else
memset (ITEMPTR (list, firstItemPosition - 1), 0,
(*list)->itemSize * numItemsToInsert);
(*list)->numItems += numItemsToInsert;
}
return 1;
}
2.2device_deregister(char *devname)
int device_deregister(char *devname)
{
int i,l,dev_index;
device_t *dev = NULL;
char temp_names[3][8];
dev_index=-1;
for (i=1; i<=ListNumItems(devlist); i++) {
dev = ListGetPtrToItem (devlist, i);
if(strcmp(dev->name,devname)==0) {
dev_index=i;
break;
}
}
if(dev_index<0) /* device not found */
return 0;
/* get stdio devices (ListRemoveItem changes the dev list) */
for (l=0 ; l< MAX_FILES; l++) {
if (stdio_devices[l] == dev) {
/* Device is assigned -> report error */
return -1;
}
memcpy (&temp_names[l][0],
stdio_devices[l]->name,
sizeof(stdio_devices[l]->name));
}
ListRemoveItem(devlist,NULL,dev_index);
/* reassign Device list */
for (i=1; i<=ListNumItems(devlist); i++) {
dev = ListGetPtrToItem (devlist, i);
for (l=0 ; l< MAX_FILES; l++) {
if(strcmp(dev->name,temp_names[l])==0) {
stdio_devices[l] = dev;
}
}
}
return 0;
}
三、设备搜索
/* 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;
}
分享到:
相关推荐
2.安装DNW驱动,直到设备管理器里面看到新的设备为止 3.将开发板侧面的拨码开关拨到“nor ”启动方式 4.打开串口软件,启动U-BOOT,在菜单里面选择"N",也就是烧写U-BOOT到NAND FLASH的那个选项 5这时如果一切正常...
这是一个管理构建u-boot和内核映像的环境,因此您可以快速破解u-boot或内核并测试您的工作。 入门 首先,您需要签出此存储库,然后通过运行bootstrap目标使用u-boot,内核和buildroot源将其填充: make bootstrap ...
第9课第4节 u-boot分析之u-boot命令实现 第9课第5节 u-boot分析_uboot启动内核 第10课第1节 内核启动流程分析之编译体验 第10课第2节 内核启动流程分析之配置 第10课第3节 内核启动流程分析之Makefile 第10课...
如果你想使用U-Boot,需要换掉存储设备。 5.4.1.2 开发板识别数据 所有的Makalu开发板使用一个序列号加以识别。而且开发板需要分配一个以太网MAC地址。如果这些数据丢失,你可能会失去授权。在安装U-Boot或者改变...
第9课第4节 u-boot分析之u-boot命令实现 第9课第5节 u-boot分析_uboot启动内核 第10课第1节 内核启动流程分析之编译体验 第10课第2节 内核启动流程分析之配置 第10课第3节 内核启动流程分析之Makefile 第10课...
如果您使用的是Windows7系统:1)插入你的U盘2)右键单击usb_install_RUNASADMIN.bat,选择以管理员身份运行3)按照屏幕提示进行安装。使用U盘启动引导设备,重启后可以直接进入系统,无需使用密码适用所有windows...
Samsung公司推出的一款为手持设备或其他通用设备开发的32位处理器,它基于ARM7TDMI核,没有内存管理单元(MMU)。在采用无MMU的微处理器的嵌入式系统中广泛采用的就是uClinux系统,作为linux的衍生系统,其具有支持...
挂载USB存储设备时,如果不用samba请删之。) 6. 按住reset键30秒后led闪烁,60秒之前松开reset键则恢复出厂设置。 7. LAN/WAN两个网口正常。 8. 默认开启WiFi,无密码。 9. 支持模式切换开关,定义如下: AP: ...
iot-ucy是使用java语言且基于netty, spring boot, redis等开源... 主打工业物联网底层网络交互、设备管理、数据存储、大数据处理. (其中plc包括西门子S7系列,欧姆龙Fins). 数据存储将使用taos数据库以及redis消息队列
IPC设备的前端软件应用于linux操作系统,linux管理了各种视频资源和服务的调度。 3.Linux的启动过程 硬件启动,u-boot初始化硬件引导linux kernel,挂载根文件系统,进入init函数,APP创建启动,如下图。 4.Linux...
FIT表示瘦版本,不能自身配置命令,只能通过AC设备统一管理配置;(当AP数量多时,可采用瘦版本) FAT表示胖版本,可以自己配置相关命令; AP瘦转胖 以下是胖变瘦过程,一行一行输入,不要全部复制 setenv ...
JZ4775是高集成度、高性能和低功耗的 32 位 RISC 处理器,带有 MMU 和数据及指令 Cache, ...程序 U-Boot,Linux 3.x 内核和驱动,Linux 电源管理,Linux 无线网络驱动和配置,Linux GUI 移植 和应用开发等。
9.4.5 USBD层的设备管理 9.4.6 设备类驱动与USBD接口 9.5 USBD文件系统接口 9.5.1 设备驱动程序访问 9.5.2 设备拓扑访问 9.5.3 设备信息访问 9.6 设备类驱动与文件系统接口 9.7 USB HUB驱动程序 9.7.1 HUB...
Boot DOS with CDROM + U-DISK 标准功能+光驱驱动+U盘驱动 Boot DOS ONLY (No Any Drivers) 只启动基本DOS系统 REBOOT YOUR PC 重启计算机 SHUTDOWN YOUR PC 关闭计算机 注1:标准功能是指已加载himem.sys和emm...
-国嵌内核驱动进阶班-2-6(U-Boot启动流程).avi -国嵌内核驱动进阶班-2-7(Uboot移植).avi -国嵌内核驱动进阶班-2-8(必修实验).avi 国嵌视频4.iso -国嵌课程4(嵌入式LINUX内核驱动进阶班-下) -第3天(内核...
-国嵌内核驱动进阶班-2-6(U-Boot启动流程).avi -国嵌内核驱动进阶班-2-7(Uboot移植).avi -国嵌内核驱动进阶班-2-8(必修实验).avi 国嵌视频4.iso -国嵌课程4(嵌入式LINUX内核驱动进阶班-下) -第3天(内核开发...
此外, BOOTICE 还具有分区管理、扇区查看以及对 USB 移动存储设备进行重新格式化的功能。 BOOTICE 还提供对 *.IMG/*.IMA/*.VHD 格式的磁盘镜像文件的处理,包括主引导记录和分区引导记录的修改和扇区查看功能。
U-Boot移植) 硬件访问) 设备模型) 块设备驱动程序) 网卡触摸屏) USB驱动程序开发) USB系统架构) PCI串口) LCD驱动程序) 硬件访问) LINUX USB系统) 时钟与定时器驱动) ARM系统开发基础) ...
它的大概内容是:裸机、U-boot、Linux内核、Linux设备驱动。那时还没有这样讲解整个系统的书,芯片厂家Linux开发包也还不完善,从bootloader到内核,再到设备驱动都不完善。有全系统开发能力的人也很少。于是这书也...