SOC固件(BIOS)开发:

1.熟悉硬件原理图:要弄清楚pin脚的功能;

2.配置GPIO引脚,配置成Native功能还是GPIO功能(如果是配置成GPIO,需要在code里面显式的使用);

3.硬件驱动是通过controller的寄存器来访问device的:以IIC为例,如果SOC有IIC的controller,固件程序只需要配置IIC的GPIO为native功能,然后code里面通过读写IIC controller的寄存器就可以完成对IIC device的访问(IIC的硬件时序由硬件controller完成);如果没有IIC controller,则需要通过GPIO来模拟IIC的总线时序来实现对IIC device的访问(51单片机模拟IIC时序为例))

4.固件的代码组成:开源UDK(软件框架)+ SOC厂商的reference code(硬件驱动)+ 自己开发的feature(应用程序)

硬件驱动

硬件编程需要掌握的规范(USB为例):

1.通用的工业规范,比如USB总线协议,USB Host controller协议:前者规定了比如时序的定义,后者定义了寄存器接口(可以理解为硬件厂商在实现USB controller的功能时需要提供给软件的接口,软件只需要按spec操作寄存器就行了,而时序是由硬件自动实现的);

2.硬件厂商的datasheet,除了上面的寄存器,厂商可能还会有其他的寄存器来实现自家特有的功能;

3.使用的系统软件的相关API与接口要求:比如UDK里面的硬件驱动实现的接口以PROTOCOL的形式提供给上层调用,而Linux下的驱动程序实现的接口表现为某种结构体。

从驱动程序的角度看硬件控制器,控制器就是一组寄存器:

1.驱动程序通过读写寄存器来初始化硬件控制器;

2.提供符合系统规范的接口(系统通过统一的接口访问不同的硬件):

在不同的软件系统里面写硬件驱动,需要熟悉软件系统的接口,比如软件系统提供的API,软件系统规定的驱动程序需要实现的接口。比如UDK里面的硬件驱动实现的接口以PROTOCOL的形式提供给上层调用,而Linux下的驱动程序实现的接口表现为某种结构体。

寄存器

PCIe配置寄存器:通过IO CF8/CFC来访问。

Controller寄存器:Controller定义的寄存器,如果Controller是挂在pcie总线上,则controller寄存器的内存基地址由pcie的BAR寄存器指定。

其他寄存器:一般来说,有固定的内存地址(比如如果我们需要在系统下面查看某个GPIO的输出状态,可以通过查看code或者spec来计算出该GPIO的内存地址,在系统用tool查看该内存地址的值,看描述GPIO输出状态的那个个bit位就行了)。

IO

CF8/CFC:访问PCIe配置空间(寄存器)

CF9:Reset Generator

  1. IoWrite8(CF9, 0x6); //系统重启,不掉电
  2. IoWrite8(CF9, 0xe); //系统重启,掉电

70/71:RTC controller

有些IO的操作是与EC通信的,这时需要map到LPC总线上:

比如现在想要通过68/6c与EC通信:

1.配置LPC的68/6c的decode,这样对68/6c的访问就会map到LPC总线上;

2.EC需要配置,这样才能响应LPC总线上的68/6c的操作

60/64:keyboard controller

62/66:Microcontroller

62/66是ACPI里面定义的,用来OSPM读写EC OperationRegion(EC RAM Space)的。

比如:往EC RAM Space的offset A9的位置写值0x01:

2E-2F:Super IO

4E-4F:Microcontroller

80:一般来说,BIOS可以通过往port80写值来记录代码的运行,往port80写的值会通过LPC总线写到EC的RAM区域:

BIOS备忘录之x86硬件编程(寄存器与IO)的更多相关文章

  1. BIOS备忘录之IIC(touchpad)设备

    简述BIOS中对IIC device的支持,以touchpad为例. 信息收集 收集平台的硬件信息: 1. IIC controller number(PCH一般包含多个controller,我们使用 ...

  2. 直接在x86硬件上显示图片(无os)

    1 任务 为了学习计算机底层和os,我给自己布置了一个任务:在x86硬件上,使用c和nasm来显示一张bmp图片.完成这个任务,前后估计花了2个月的业余时间. 这个任务涉及了很多知识点,包括:启动区. ...

  3. x86-1-32位x86 处理器编程架构

    x86(32位)-1-32位x86 处理器编程架构 Intel 32 位处理器架构简称IA-32(Intel Architecture,32-bit) x86是指intel的86系列的CPU统称,比如 ...

  4. 33.JAVA编程思想——JAVA IO File类

    33.JAVA编程思想--JAVA IO File类 RandomAccessFile用于包括了已知长度记录的文件.以便我们能用 seek()从一条记录移至还有一条:然后读取或改动那些记录. 各记录的 ...

  5. 网络编程 - 协议遇到IO自动切换

    一.协议遇到IO自动切换 python网络编程,遇到IO自动切换,通过模块gevent来实现: import gevent,time def g1(): print ("g1 is star ...

  6. KVM基于X86硬件辅助的虚拟化技术实现机制【转】

    内存虚拟化 Shadow Paging 作者 Shawn 在其中文博客中很详尽地介绍了 KVM 在只支持一级分页的 x86 平台上用 “Shadow Paging”进行 MMU 虚拟化的实现,由于目前 ...

  7. BIOS备忘录之EC常用知识点

    BIOS工程师眼中常用的EC知识点汇总: EC的硬件架构 EC硬件结构上主要分为两部分:Host Domain和EC Domain Host Domain就是通过LPC与CPU通信的部分(LPC部分需 ...

  8. BIOS备忘录之ASL code常用知识点

    _HID:device唯一 _STA:决定device在不在(在DM下面能不能看到) _CRS:描述分配给device的资源 _INI:在OSPM加载描述表的时候运行一次(比如,如果要根据不同情况给d ...

  9. BIOS备忘录之通过Windbg来追踪ASL code的运行

    通过Windbg来追踪ASL code的运行: 目标机的配置: 第一步: 在BIOS Setup下面 disable secure boot(不然下面debug on 命令会失败):关闭防火墙. 第二 ...

随机推荐

  1. Nessus中文报告自动化脚本

    前言 Nessus扫描完成,总要花挺多时间去整理报告,为此写了一个小脚本,用于自动化生成中文漏洞报告. 解析导出的html报告,自动翻译成中文,并提供修复建议,减少整理报告的时间,提升工作效率. gi ...

  2. 如何优雅的选择字体(font-family)

    大家都知道,在不同操作系统.不同游览器里面默认显示的字体是不一样的,并且相同字体在不同操作系统里面渲染的效果也不尽相同,那么如何设置字体显示效果会比较好呢?下面我们逐步的分析一下: 一.首先我们看看各 ...

  3. ios12 siri 语音识别

    原理:先用系统的录音器录音,让后让siri识别语音转文字 第一步 :在项目plist文件添加授权如图 第二步:导入头文件,添加协议#import <Speech/Speech.h>#imp ...

  4. D - F(x)

    For a decimal number x with n digits (A nA n-1A n-2 ... A 2A 1), we define its weight as F(x) = A n ...

  5. git checkout --theirs(ours)

    假设原来有文件A,程序员甲把A进行了完全的重写,而甲在自己的branch工作的同时,他的同事程序员乙则对A进行了一个优化.这样,当甲想要merge的时候,A文件就有很多的冲突,可能多达几百行. 这时候 ...

  6. luke下载使用

    网上内容太多,下载了却不管用,即使下载了,也不知道怎么用.(对我这种小白来说,大神就一笑而过吧) 下载地址:http://www.xdowns.com/app/253909.html(如若下载不到可以 ...

  7. CRM项目自定义的知识点

    python manage.py shell #自动配置环境 a = models.CustomerInfo #实例对象可以a._meta # dir 可以查看字段方法 a._meta.app_lab ...

  8. Kubernetes实战(一):k8s v1.11.x v1.12.x 高可用安装

    说明:部署的过程中请保证每个命令都有在相应的节点执行,并且执行成功,此文档已经帮助几十人(仅包含和我取得联系的)快速部署k8s高可用集群,文档不足之处也已更改,在部署过程中遇到问题请先检查是否遗忘某个 ...

  9. git:当本地分支中的代码和develop分支上有很多冲突,希望删掉本地分支,重新建立新的分支,怎么解决?

    git:当本地分支中的代码和develop分支上有很多冲突,希望删掉本地分支,重新建立新的分支,但是git中说你需要先解决当前的冲突,这种情况怎么解决 这种情况可以在代码编辑器中点击commit,然后 ...

  10. Jmeter学习之-从数据库取出数据并且校验数据是否准确

    https://www.cnblogs.com/wuyonghuan/p/7479582.html 应用场景:调用某个接口像数据库中插入数据,需要在接口调用完成后查看数据更新或插入的数据是否正确的时候 ...