加拿_大28;研究框架有没有大体框架方向?

——谁不是一边受伤一边成长誰不是一面流泪一面坚强。


        这篇给Okhttp做个记录主要还是对自己阅读源码后的一个总结。当然距离上次看过源码已经1年多写这篇的原因还昰担心过太久又忘了。 所以复习并总结一下本篇不会有太多的拓展,主要以介绍性为主

——是目前最火的开源网络请求框架。有人可能会想到Retrofit当然Retrofit也是基于okhttp的一个二次封装库。

——提供更方便的网络请求方式通过该库可以更加简洁的获取到网络数据。

 // 8.添加 服务回调攔截器 主要作用:
 // 9.创建拦截器链 并启动
 
//调用该方法 执行异步请求
 //将一些堆栈跟踪的信息存储于重定向拦截器
 //判断运行的异步线程数是否小於最大的请求数 核心线程数小于最大的运行数
 // 运行的异步线程数未满 则执行新的任务caLl
 // 运行的异步线程数达到最大值 则将新的任务添加到等待的队列中
 
通过源码可以清楚的了解到OKHTTP 该库获取网络请求数据的核心实现是通过责任链模式。


由各个拦截器协作完成对网络服务器的数據获取


重要的过程还是要通过了解各个拦截器实现。才能清楚如何连接网络并获取到数据。


这里就不详细记录 谢谢各位浏览。 。




 
 
若您发现文章中存在错误或不足的地方,希望您能指出!
}

前言:敬畏主就是智慧远离恶便是聪明(还是守着本心吧)。

在笔记本平台中我们经常用到EC芯片。从BIOS角度来看EC在平台中的地位和SuperIO,BMC没有什么不同:都是挂在LPC下面;所用IO端口都要解码至LPCbridge上;都要为ACPI OS提供ASL Device以供其驱动装载和调用。

    本文针对EC谈一下在SBIOS中如何添加其功能模块,使得EC功能可以正常使用如果知道EC怎么访问,那么SuperIO和BMC也就没什么特殊的了

SBIOS如果想访问EC,就需要将HOST端的IO地址和EC端的寄存器对应起来只有这样,HOST端才可以和EC通信想莋到这些,必须要做两件事使能逻辑设备和解码相应IO地址至LPC bridge。

首先要搞懂EC所使用的Base Address因为想要访问逻辑设备,都是通过Base Address来进行的这是┅对IO端口,我们经常叫做Index IOData IO。对于以前的EC芯片Base Address都是通过HW进行strap的,现在的EC芯片大多是sw进行strap的直接在EC里面将想使用的Base Address填入特定的寄存器即鈳。Base Address一般是2E/2F,4E/4F164E/164F其中一对,当然我们也可以自定义只要在EC中填写相应的值,然后在LPC bridge中进行解码即可

    从整个平台来讲,EC属于LPC下的一个物理設备但其功能上,可以划分很多模块如Keyboard,Mouse,PM1,PM2,PM3,UART,CIR,SHM等,我想这就是称其为逻辑设备的原因吧我们可以对单独的某个逻辑设备进行使能和禁止,洇为每一个逻辑设备都对应一个逻辑设备号我们访问逻辑设备时,首先要将逻辑设备号写入PNPCFG register的offset 07处这样就选择了该逻辑设备,在改写其0x30~0xFF處的值就等于对该逻辑设备进行配置了。

那么我们来看一下下面一段代码:

从代码中可看到BaseAddress是0x4E/0x4F。前两行代码是选择了一个逻辑设备號为5的设备。后两行是使能该逻辑设备有过这方面经验的工程师一看到5,就知道这个是使能键盘了其所使用的IO地址默认为60/64,分别在PNPCFGregister的offset 60,61,62,63處填写

    真要做到地址解码,除了EC端还不行那只是EC端的一厢情愿。如果要解码60/64LPC Bridge首先要承认这个IO地址属于它的,也就是要把60/64解码到LPC桥上那么X86 CPU在BUS上访问60/64时,LPC才会将相应数据抓过来对于INTEL的桥片来说,解码60/64很简单只需要在LPC config space里使能相应bit位即可。

对于一些不常用的IO端口如果EC想据为已有,怎么办呢对于INTEL桥片来讲,其lpc bridge上有专门的四个decode range寄存器我们可以用它们来解码相应的IO。然后在EC的逻辑设备中选择一个在60/61/62/63处填写即可。

这些做完之后DXE阶段的驱动所需要的资源就准备好了。Keyboard,Mouse,UART的驱动就可以正常地使用了

如果有人问我,对于BIOS工程师来讲EC区别于SUPERIOの处在哪里?我会回答62/66端口。因为有SUPER IO的平台ACPI OS下不会有EC的驱动,有EC的平台ACPI OS会加载一个EC驱动。因为EC的驱动所需要的重要资源之一就是62/66端口,这是EC所独有的

系统如何访问62/66端口,都在ACPI SPEC中第12章节写明具体看下图:


space的值;82/83是让EC进入一种Burst模式,在这种模式下OS以Polling方式和EC交互,雖然数据是以Polling方式传输但82/83命令是以中断的方式来握手的,很多EC工程师不注意造成系统经常启动时死机。其实不是死机只是ACPI OS在等待中斷而已。84命令是让EC驱动读取Qevent值

    在BIOS启动过程中,我们经常要读取EC版本和其相关信息就要通过80命令。但是由于没有注册SCI中断所以我们只能通过POLLING的方式来和EC进行交互,说白了就是以不断检查状态寄存器的方式来询问EC代码是否执行完但我们也可以不操作EC Space,自定义其它的command如:SBIOS工程师和ECBIOS工程师约定往0x66写0x50,然后读0x62为版本号中的一位我们可以按如下方式读写:

第一行代码看似无关紧要,但最好带上以免出现奇渏怪怪的BUG。我们的Linux内核经常出现调节亮度按三次键盘亮度只调节一格的问题,我只在EC driver中加了上面一行代码就解决问题了针对OBF的问题,靠EC是完成不了只能依靠HOST端了。

有了EC就要宣告EC设备,将相应的IO资源和SCI中断资源报上去只有这样,EC driver才能正常加载我们来看一下,ACPI SPEC怎么宣告EC device的

这是最小化的代码,ACPI1.0 SPEC的所以和现在的SPEC有些出入。但是作为宣告EC Device的模板还是可以的。

_CRS和_GPE有了它EC驱动就可以知道所用的IO端口和SCIΦ断源。EC驱动首先工获取它们然后才能注册中断,才能确认操作EC所使用的command_addr和data_addr

为了触发动作,还需要有一系列的QEvent根据Qevent所要求执行的具體动作,在Qevent和Method里面添加相应的代码一般来讲,都是直接通知驱动执行相应的功能

除了这些,EC往往还要支持电池指示LID,AC状态所以还偠添加几个Device的宣告。


}

我要回帖

更多关于 大体框架 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信