简述BIOS中对IIC device的支持,以touchpad为例。

信息收集

收集平台的硬件信息:

1. IIC controller number(PCH一般包含多个controller,我们使用的是哪一个);

2. INT / Reset信号用的是哪个GPIO;

3. Enable信号用的是哪个GPIO(Enable信号一般由EC控制,这样可以通过Hotkey来Enable/Disable)

收集device的信息:

1. slave address;

2. hid descriptor address;

3. vendor ID, Product ID;

4. _HID(根据driver确定)

软件初始化

GPIO的配置:

1. SDA,SCL一般直接配置成native function就行了;

2. INT / Reset要配置成GPIO(并且需要在code里面显式的使用:使用GPIO的内存地址或int number)

在BIOS setup下面配置device的相关参数:

设备类型,中断模式,总线地址(controller number),HID地址,速度,SDL Hold Time等,这些参数会通过GNVS传给ASL code(可参考:

BIOS备忘录之ASL code常用知识点 里面的BIOS code与ASL code是如何传递数据的)

我们在系统下通过RW查看寄存器:

ASL code初始化

1. 根据GNVS的参数,赋值正确的_HID, HID2等;

2. 修改_CRS,配置device使用的系统资源,这里一般会把INT引脚的int number传进来(体现了GPIO的显式使用

问题举例

1. device在DM下看不到:

>>> 检查controller是否已经enable;

>>> 检查device在_STA中有没有返回 1。

2. device不能正常工作:

>>> 测量时序,比如配置SDA Hold Time;

>>> 检查EC的使能信号;

>>> 尝试更改clock的频率;

>>> 检查中断信号的设置(中断方式,是否设置了反转等);

>>> 测量是否有漏电(添加code在合适的位置来拉RST/EN)。

support多种device

如果项目支持多种device,比如支持2种touchpad,这时需要BIOS能自动检测不同的device,然后在asl code里面赋值不同的_HID,以便在OS下能安装正确的driver(note:2种touchpad的slave address和hid address要一样)

一般来说,对IIC device,我们会在post过程中去读取IIC device的HID descriptor,从而得到device类型,厂商...,进而在ASL code里面为不同的device赋值不同的_HID,以便安装正确的driver。

BIOS C code IIC driver的作用:

1. 把IIC controller number,slave address,hid address,int(一般为内存地址(体现了GPIO的显式使用),BIOS根据输入判断是否有中断产生),reset传给BIOS;

2. BIOS根据IIC controller number,slave address,hid address获取device的hid descriptor;

3. 把hid descriptor里面的vendorID,productID通过GNVS告诉ASL code给device赋值不同的_HID

Enable/Disable TouchPad

在OS下我们可以通过Hotkey来Enable/Disable touchpad,常用做法:

1. EC 拉GPIO:EC检测到按键按下,直接把device的en信号拉低;

2. EC 发Q Event 告诉Driver:EC检测到按键按下,发Q Event告诉OS,OS调用ASL 来处理(这种方式需要自定义的driver配合)

BIOS备忘录之IIC(touchpad)设备的更多相关文章

  1. BIOS备忘录之SPI(fingerprint)设备

    Reset和INT信号使用的是GPIO功能,需要显式的使用(INT信号使用了GPIO的int number,RST信号使用了GPIO的absolute number): 问题举例 漏电导致功能异常:在 ...

  2. RT-thread 设备驱动组件之IIC总线设备

    本文主要介绍RT-thread中IIC总线设备驱动,涉及到的主要文件有:驱动框架文件(i2c_core.c,i2c_dev.c,i2c-bit-ops.c,i2c_dev.h,i2c.h):底层硬件驱 ...

  3. BIOS备忘录之x86硬件编程(寄存器与IO)

    SOC固件(BIOS)开发: 1.熟悉硬件原理图:要弄清楚pin脚的功能: 2.配置GPIO引脚,配置成Native功能还是GPIO功能(如果是配置成GPIO,需要在code里面显式的使用): 3.硬 ...

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

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

  5. Arduino IIC 主从设备连接通信

    目的:        实现Arduino主从设备之间的互相IIC通信,掌握IIC通信协议的使用方法. 器材: Arduino UNO R3 一块 Arduino Nano 三块 面包板   导线 3K ...

  6. BIOS启动项中的设备都有哪些

    Floppy 软式磁盘驱动器,简称FDD,也就是我们平时所说的软驱. CD-ROM 不用多说了,大家都知道,这是光盘驱动器,也就是我们平时说得光驱. SCSI SCSI的全名是:Small Compu ...

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

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

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

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

  9. IIC设备驱动程序

    IIC设备是一种通过IIC总线连接的设备,由于其简单性,被广泛引用于电子系统中.在现代电子系统中,有很多的IIC设备需要进行相互之间通信 IIC总线是由PHILIPS公司开发的两线式串行总线,用于连接 ...

随机推荐

  1. miniprogrampatch 提供 watch 和 computed 特性

    推荐一个小程序补丁 github:miniprogrampatch,为你的 Page 和 Component 增加 watch 和 computed 特性. 安装 通过 npm 安装:npm inst ...

  2. socket详解(二)----实例和多线程,线程池使用

    一般而言,Java 语言中的套接字有以下两种形式: TCP 套接字(由 Socket 类实现,) UDP 套接字(由 DatagramSocket 类实现) TCP 和 UDP 扮演相同角色,但做法不 ...

  3. rabbitmq - java client lib一二事

    由于不可抗因素, 需要给对接方撸一个client的demo.基于比较老的jdk. 所幸找到了这里:http://www.rabbitmq.com/releases/rabbitmq-java-clie ...

  4. SQL特殊字符转义

    原文链接: SQL特殊字符转义 应 该说,您即使没有处理 HTML 或 JavaScript 的特殊字符,也不会带来灾难性的后果,但是如果不在动态构造 SQL 语句时对变量中特殊字符进行处理,将可能导 ...

  5. 学习完HTML后的5大测试题----9.18

    考试题目   第一题: 布局出该效果 提示:使用DIV的border样式,调整边框粗细出现该效果,保留上边框,其它三个方向的边框需设置:border-left:100px solid transpar ...

  6. POJ 3279 - Fliptile - [状压+暴力枚举]

    题目链接:http://poj.org/problem?id=3279 Sample Input 4 4 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 Sample Output 0 ...

  7. 前端模板 artTemplate之辅助方法template.helper

    var labelMap = { onlinePayment:{ label:"在线支付", desc:"支持大部分储蓄卡.信用卡及第三方平台支付", name ...

  8. vue-cli脚手架

    cnpm i vue-cli -g   //npm 安装报错,原因不明,可能是我改过东西的原因,但是cnpm可以安装 命令行进入要新建的vue的目录执行 C:\Users\76912\Videos\v ...

  9. for循环中break与continue的区别

    1.for循环 for循环是更加简洁的循环语句,大部分情况下,for循环可以代替while循环.do-while循环. for循环的格式为: for( 初始语句 ; 执行条件 ; 增量 ){循环体}执 ...

  10. AdPlus

    adplus是windbg下面附带的一个小工具: https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/adplus A ...