绍兴网站制作网站中国空间站照片

news/2025/9/23 8:34:57/文章来源:
绍兴网站制作网站,中国空间站照片,风云榜,音乐网站怎么做精准关键词做Linux方面也有三个多月了#xff0c;对代码中的有些结构一直不是非常明确#xff0c;比方platform_device与platform_driver一直分不清关系。在网上搜了下#xff0c;做个总结。两者的工作顺序是先定义platform_device - 注冊 platform_device-#xff0c;再定义…       做Linux方面也有三个多月了对代码中的有些结构一直不是非常明确比方platform_device与platform_driver一直分不清关系。在网上搜了下做个总结。两者的工作顺序是先定义platform_device - 注冊 platform_device-再定义 platform_driver- 注冊 platform_driver。  1platform_device设备的注冊过程必须在对应设备驱动载入之前被调用由于驱动注冊时须要匹配内核中所以已注冊的设备名。platform_device 是在系统启动时在init.c 里的s3c_arch_init() 函数里进行注冊的。这个函数申明为arch_initcall(s3c_arch_init); 会在系统初始化阶段被调用。arch_initcall 的优先级高于module_init所以会在Platform 驱动注冊之前调用。如今内核中不是採用arch_initcall(s3c_arch_init) 注冊platform_device 结构体而是通过.init_machine成员将其保存在arch_initcall(customize_machine)等待调用在mach-smdk6410.c中定义的MACHINE_START到MACHINE_END事实上质是一样的均放在.initcall3.init等待调用。之后再定义结构体struct platform_driver在驱动初始化函数中调用函数platform_driver_register() 注冊 platform_driver。具体过程描写叙述例如以下       Linux从2.6版本号開始引入了platform这个概念在开发底层驱动程序时首先要确认的就是设备的资源信息在2.6内核中将每一个设备的资源用结构platform_device来描写叙述该结构体定义在kernel/include/linux/platform_device.h中 struct platform_device{const char * name;u32 id;struct device dev;u32 num_resources;struct resource * resource; }; 该结构一个重要的元素是resource该元素存入了最为重要的设备资源信息定义在kernel/include/linux/ioport.h中 比方 struct resource {const char *name;unsigned long start, end;unsigned long flags;struct resource *parent, *sibling, *child; }; 实比如 static struct resource s3c_usb_resource[] {[0] {.start S3C_PA_USBHOST,.end S3C_PA_USBHOST S3C_SZ_USBHOST - 1,.flags IORESOURCE_MEM,},[1] {.start IRQ_UHOST,.end IRQ_UHOST,.flags IORESOURCE_IRQ,} }; 以上是6410的USB  HOST分配的资源信息。第1组描写叙述了这个usb host设备所占用的总线地址范围起始地址和大小由硬件决定IORESOURCE_MEM表示第1组描写叙述的是内存类型的资源信息第2组描写叙述了这个usb host设备的中断号也由硬件设定IORESOURCE_IRQ表示第2组描写叙述的是中断资源信息。设备驱动会依据flags来获取对应的资源信息。       有了resource信息就能够定义platform_device了 struct platform_device s3c_device_usb {.name s3c2410-ohci, //s3c6410-usb.id -1,.num_resources ARRAY_SIZE(s3c_usb_resource),.resource s3c_usb_resource,.dev {.dma_mask s3c_device_usb_dmamask,.coherent_dma_mask 0xffffffffUL} }; 有了platform_device就能够调用函数platform_add_devices向系统中加入该设备了。系统中的设备资源都能够採用这样的方式列举在一起然后成一个指针数组如 static struct platform_device *smdk6410_devices[] __initdata { ......  s3c_device_usbgadget,  s3c_device_usb,  //jeff add. ...... } 然后在6410的初始化函数smdk6410_machine_init中运行 platform_add_devices(smdk6410_devices, ARRAY_SIZE(smdk6410_devices));将全部的device加入进系统。platform_add_devices的优点在于它是一次性的运行多个platform_device_register。 2 至于驱动程序须要实现结构体struct platform_driver也定义在kernel/include/linux/platform_device.h中 struct platform_driver {int (*probe)(struct platform_device *);int (*remove)(struct platform_device *);void (*shutdown)(struct platform_device *);int (*suspend)(struct platform_device *, pm_message_t state);int (*suspend_late)(struct platform_device *, pm_message_t state);int (*resume_early)(struct platform_device *);int (*resume)(struct platform_device *);struct pm_ext_ops *pm;struct device_driver driver; }; 则该处的USB HOST实现是 static struct platform_driver ohci_hcd_s3c2410_driver {.probe ohci_hcd_s3c2410_drv_probe,.remove ohci_hcd_s3c2410_drv_remove,.shutdown usb_hcd_platform_shutdown,/*.suspend ohci_hcd_s3c2410_drv_suspend, *//*.resume ohci_hcd_s3c2410_drv_resume, */.driver {.owner THIS_MODULE,.name s3c2410-ohci,}, };       在驱动初始化ohci-hcd.c的1124行函数中调用函数platform_driver_register()注冊该platform_driver须要注意的是s3c_device_usb结构中name元素和ohci_hcd_s3c2410_driver 结构中driver.name必须是同样的这样在platform_driver_register()注冊时会对全部已注冊的platform_device中元素的name和当前注冊的platform_driver的driver.name进行比較仅仅有找到具备同样名称的platform_device存在后platform_driver才干注冊成功。当注冊成功时会调用platform_driver结构元素probe函数指针这里就是ohci_hcd_s3c2410_drv_probe開始探測载入。platform driver中的函数都是以platform device作为參数进入。 3为什么两个name的名字必须匹配才干实现device和driver的绑定1在内核初始化时kernel_init()-do_basic_setup()-driver_init()-platform_bus_init()初始化platform_bus(虚拟总线)2设备注冊的时候platform_device_register()-platform_device_add()-(pdev-dev.bus platform_bus_type)把设备挂在虚拟的platform bus下3驱动注冊的时候platform_driver_register()-driver_register()-bus_add_driver()-driver_attach()-bus_for_each_dev()对每一个挂在虚拟的platform bus的设备作__driver_attach()-driver_probe_device()推断drv-bus-match()是否存在而且是否运行成功此时通过指针运行platform_match比較strncmp(pdev-name, drv-name, BUS_ID_SIZE)假设相符就调用really_probe实际就是运行的对应设备的platform_driver-probe(platform_device)注意platform_drv_probe的_dev參数是由bus_for_each_dev的next_device获得開始真正的探測载入假设probe成功则绑定该设备到该驱动。       当进入probe函数后须要获取设备的资源信息依据參数type所指定类型比如IORESOURCE_MEM来分别获取指定的资源。 struct resource * platform_get_resource(struct platform_device *dev, unsigned int type, unsigned int num);当然也能够固定资源类型如获取资源中的中断号struct int platform_get_irq(struct platform_device *dev, unsigned int num);       probe函数一般完毕硬件设备使能struct resource的获取以及虚拟地址的动态映射和详细类型设备的注冊由于平台设备仅仅是一种虚拟的设备类型);remove函数完毕硬件设备的关闭struct resource以及虚拟地址的动态映射的释放和详细类型设备的注销。仅仅要和内核本身执行依赖性不大的外围设备 ( 换句话说仅仅要不在内核执行所需的一个最小系统之内的设备 ), 相对独立的拥有各自独自的资源 (addresses and IRQs) 都能够用platform_driver 实现。如lcd,usb,uart 等都能够用platfrom_driver 写而timer,irq等最小系统之内的设备则最好不用platfrom_driver 机制实际上内核实现也是这种。  參考原文http://blog.chinaunix.net/u1/49507/showart_494193.html 參考原文http://blog.csdn.net/yd4330152763132/archive/2010/02/01/5275776.aspx 转载于:https://www.cnblogs.com/mengfanrong/p/3806244.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/911920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wps做网站框架网络营销官网

BeanShell简介BeanShell是使用Java语法的一套脚本语言,在JMeter的多种组件中都有BeanShell的身影,如:定时器:BeanShell Timer前置处理器:BeanShell PreProcessor采样器:BeanShell Sampler后置处理器&#x…

做进口产品的网站好it外包公司怎么接项目

目录 问题解决 常见的打开模式 问题解决 出现于调用os.Open来打开的文件进行写操作时报的错,原因在于Open函数: func Open(name string) (*File,error) {return OpenFile(name, O_RDONLY, 0) } Open调用了OpenFile,而OpenFile默认以只读…

网站换域名seo怎么做哪家企业做网站好

现在淘宝 (淘宝论坛)店主在经营店铺的过程中,会考虑将自己特别店铺进行类目的更改,那么也有一点店主会担心到如果淘宝更改类目会被降权吗?如果被降权了怎么办呢?那就一起了解具体的内容吧!跟大家分享一些淘宝宝贝被降权的处理方式:1、虚假销…

做网站的封面图片哪里才有深圳百度推广

目录 1. 认识 Linux, 了解 Linux 的相关背景 1.发展史 2. 学会如何使用云服务器 3. 掌握使用远程终端工具 xshell 登陆 Linux 服务器 1. 认识 Linux, 了解 Linux 的相关背景 1.发展史 学习Linux系统编程,你可能要问Linux从哪里来?它是怎么发展的&am…

视频网站建设广州专业找人见人付款

2019独角兽企业重金招聘Python工程师标准>>> 场景 如图下,当A、B列与E、F列皮配上,C列则引用G列的值 原理 VLOOKUP只能查找单列值。我们可以把多列值拼接后形成一个虚拟列,然后VLOOKUP函数查找这个虚拟列进行匹配。 在C1处输入下…

对网站的建议和优化网络营销策划以什么为核心

一、基本概念 string本质是一个类,封装了c风格字符串(以\0结尾的字符数组),具备自动管理内存功能,提供了多种构造函数和多种删查增改的成员方法。string的本质特点归结以下几点: 1、动态数组:…

网站开发如何优秀网站模板下载

到现在为止都是在开发板上运行的裸机程序,相当于之前学习STM32单片机时走过的路,还没有真正进入到核心的驱动开发部分,但这都是基础,所以慢慢来不着急。 接下来进入串口通信的学习,和GPIO一样,也是和单片机…

完整教程:第33章 AI在教育领域的应用

完整教程:第33章 AI在教育领域的应用pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

python微博舆情分析系统 情感分析 爬虫 机器学习 新浪微博 信息采集 大数据工艺(源码)✅

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

住房和城乡建设部网站村镇建设网站开发工作介绍

文章目录 NginxWebUI runCmd 远程命令执行漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现 0x06 修复建议 NginxWebUI runCmd 远程命令执行漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相…

成都网站设计是什么浏阳seo快速排名

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N)&…

网站开发完要过审是啥意思网络公司经营范围包括哪些

如何调整Linux内核启动中的驱动初始化顺序?【问题】此处我要实现的是将芯片的ID用于网卡MAC地址,网卡驱动是enc28j60_init。但是,读取芯片ID的函数,在as352x_afe_init模块中,所以要先初始化as352x_afe_init。此处&…

蕲春网站建设做外贸有哪些网站比较好

epoll理解及应用 select复用方法其实由来已久,因此,利用该技术后,无论如何优化程序性能也无法同时接入上百个客户端(当然,硬件性能不同,差别也很大)。这种select方式并不适合以Web服务器端开发为主流的现代…

怎么网站建设多少钱网站图片轮播怎么弄

C调用Objective-C的类和方法 最近有一个C提供回调接口调用Objective-c接口来传递数据的需求,研究了很久,最终通过bing的AI对话查到了需要的内容,这里记录一下,算是给基于C的IOS开发开了一个头。 在Objective-C中,你可…

珠海品牌网站制作服务物流企业的网站模板

Python 类的封装 承接上一节,学了Student类的定义及实例化,每个实例都拥有各自的name和score。现在若需要打印一个学生的成绩,可定义函数 print_score() 该函数为类外的函数,如下: 1 class Student(object):2 def …

制作营销网站模板下载合肥电脑培训

注意:如果是克隆的虚拟机,需要先重新生成mac地址,如下图所示 修改配置文件 :/etc/sysconfig/network-scripts/ifcfg-ens33 注意:1. BOOTPROTO设置为static 2.将下面的IPADDR地址替换为你实际要设置的ip地址 3.NAT模式…

易软通openWMS - 功能齐全的开源WMS

易软通openWMS是采用RuoYi-Vue-Plus作为后端Java框架,已做调整不兼容原框架;前端采用Vue3 + VueX + Vue-Router + Element Plus + Pinia + TypeScript + Axios + Vite为前端框架。项目代码、文档均开源免费可商用 遵…

寿光营销型网站建设巴中做网站的公司

前言 最近在做一个需求,需要从自己APP进入到系统的应用市场 方便用户在应用市场给自己的APP打分 于是查阅了一些资料,下面说一下实现方法 实现方案 一般来说,最简单的方案就是这样: val uri Uri.parse("market://details…

网站建设后期服务收费标准速升网站

软件下载 软件:CATIA Composer版本:2023语言:简体中文大小:1.82G安装环境:Win11/Win10/Win8/Win7硬件要求:CPU2.60GHz 内存8G(或更高)下载通道①百度网盘丨64位下载链接:https://pa…