简述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. eclipse启动时 failed to create the java virtual machine 解决办法

    解决步骤: 1.打开eclipse解压目录下的配置文件eclipse.ini: 2.找到 --launcher.XXMaxPermSize 256M 并改为 --launcher.XXMaxPermS ...

  2. VS Code设置成中文界面

    1.打开VS Code,按:ctrl+shift+p打开指令面板,输入lang,选择Configure Display Language 2.将"locale"后面的"e ...

  3. Ubuntu系统安装nginx

    1.首先查看linux系统 cat /proc/version Linux version 4.9.59-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.9.3 (cr ...

  4. getItemAt

    getItemAt(0) 获得第一行数据 getItemAt(1) 获得第二行数据

  5. 剑指offer——python【第36题】两个链表的第一个公共结点

    题目描述 输入两个链表,找出它们的第一个公共结点 思路 注意,这里的公告结点的意思是相同的点,不仅值相同,next也相同,那么同理公共结点后面的点也是不仅值相同,而且next也相同,这样的话,就可以把 ...

  6. C#4.5-4.7学习总结

    4.5讲的是this关键字.它用于表示对当前实例的引用,它有三种用法,一是访问属性,解决与局部变量名称冲突问题,二是访问成员方法,在类中调用自己的成员方法,就是在一个方法中,通过this.方法名,调用 ...

  7. springcloud第一步:创建eureka注册服务

    实现服务注册 创建EureKaserver 项目 Maven依赖 <parent> <groupId>org.springframework.boot</groupId& ...

  8. SpringCloud微服务高级

    分布式配置中心 什么是配置中心 在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring c ...

  9. C#基础加强(8)之委托和事件

    委托 简介 委托是一种可以声明出指向方法的变量的数据类型. 声明委托的方式 格式: delegate <返回值类型> 委托类型名(参数) ,例如: delegate void MyDel( ...

  10. window.onload和jquery等待加载的区别

    1.区别 window.onload是等待页面所有文档,图片等元素都加载完成再进行操作,是javascript原生语法. jquery是等待页面文档加载完成时,就进行操作. $(function(){ ...