SuperIo-Nct6106d

news/2024/10/18 1:39:58/

SuperIo的调试

SuperIo简称SIO,是一款Lpc设备芯片,支持多接口扩展.

文章目录

    • SuperIo的调试
      • SIO 包含哪些功能?
      • 如何通过Lpc来初始化SIO?
      • Global Controller Register
      • UART Func

SIO 包含哪些功能?

虽不同款芯片支持的功能可能不尽相同,但是大体流程和基本功能还是很相近的,下面以Nct6106D为例:

  • FDC: FOLPPY DISK CONTROLLER,软盘控制器.
  • PRT: PARALLEL PORT, 也称打印机接口逻辑.
  • UART: Universal Asynchronous Receiver/Transmitter, 标准异步收发器,俗称串口.
  • KBC: KEYBOARD CONTROLLRT, 键盘控制器, PS/2.
  • CIR: CONSUMER INFRARED REMOTE , 谷歌翻译为:消费者红外遥控器,暂时没用过,猜测是一种红外传感器吧.
  • GPIO: General Purpose Input Output.通用型输入输出.
  • GPIO,WDT: WatchDog Timer, 支持一个8位可编程的超时计数器.
  • ACPI: 简称电源管理, 信号连接到南桥(7A芯片组),用于将系统从S1~S5唤醒睡眠状态.
  • others: 包含SmartFan,Led等功能,就不详细说了.

这款芯片虽然集成了好多功能,但是使用有限,加之之前调试过几个常用功能,那我们就摘之为例进行详细介绍:

如何通过Lpc来初始化SIO?

SIO,按照手册来讲,不单单支持LPC接口,也支持SMBUS,那么如果我们将SIO接到LPC总线上,我们如何控制它呢?

  • 1.他作为一个IO设备,我们需要通过LpcIo的方式进行通讯,在龙芯处理器,Lpc的Io物理地址->虚拟地址(0x18000000->0xefdfc000000,通过X1Bar配置窗口映射到HT1的IO空间),所以LpcIo的访问我们使用UNCACHE_ADDR(0xefdfc000000)).
  • 2.通过SIO芯片控制逻辑进行功能选择:AccessSio逻辑图与代码逻辑如下:
    在这里插入图片描述
  VOID                                                                                                              Nct6106d_write(                                                                                                   UINT8 dev,                                                                                                    UINT8 addr,                                                                                                   UINT8 data)                                                                                                   {                                                                                                                 /*enter*/                                                                                                       outb(BONITO_PCIIO_BASE_VA + OFFSET_2E_4E + 0x002e,0x87);                                                        outb(BONITO_PCIIO_BASE_VA + OFFSET_2E_4E + 0x002e,0x87);                                                        if(dev != 0xff)                                                                                                 {                                                                                                               /*select logic dev reg */                                                                                       outb(BONITO_PCIIO_BASE_VA + OFFSET_2E_4E + 0x002e,0x7);                                                         outb(BONITO_PCIIO_BASE_VA + OFFSET_2E_4E + 0x002f,dev);                                                         }                                                                                                               /*access reg */                                                                                                 outb(BONITO_PCIIO_BASE_VA + OFFSET_2E_4E + 0x002e,addr);                                                        outb(BONITO_PCIIO_BASE_VA + OFFSET_2E_4E + 0x002f,data);                                                        /*exit*/                                                                                                        outb(BONITO_PCIIO_BASE_VA + OFFSET_2E_4E + 0x002e,0xaa);                                                        outb(BONITO_PCIIO_BASE_VA + OFFSET_2E_4E + 0x002e,0xaa);                                                        }                    

相信大家也都看明白了,如果你是一名软件人员,在这里有个注意的,那就是需要查看硬件原理图来确定究竟是0x2E,0x2F,还是0x4E,0x4F的端口.这是硬件的地址引脚来决定的.
上图代码中的dev标志着SIO内的逻辑设备控制器,addr是逻辑设备控制器内offset

设备ID对照表:
在这里插入图片描述

Global Control register的操作方式我们已经在代码中以dev=0xff的形式进行了区分,你在上图中应该已经发现.

Global Controller Register

简单介绍一下该组控制寄存器,以代码为例:

                                                                                                 Nct6106d_write(0xff,0x02,0x01);//reset                                                                                                                                                                        Nct6106d_write(0xff,0x26,0xc3);//2e_4e                                                                                                                                                                        Nct6106d_write(0xff,0x29,0xff);//disable legacy mode                                                                                                                                                          Nct6106d_write(0xff,0x1a,0x00);//ps/2                                                                                                                                                                         Nct6106d_write(0xff,0x1c,0x1e);//uart                                                                                                                                                                                                                                                                                                                                                                      
  • 0x02: Reset SIO 寄存器
  • 0x1a: MutliFunc 引脚复用寄存器,举例:如若使用PS/2,那么首先就需要将对应引脚设置为PS/2的功能.
    其他寄存器就先不详细说了,简单上图0x1a举例:
    在这里插入图片描述

UART Func

UART就不多介绍了,异步通讯收发器: 我们俗用串口输出调试,也有一些产品上将之作为串行打印机,串行鼠标键盘等.
Nct61061d这款芯片共集成了6个UART控制器,UARTA~UARTF.
访问UARTA见下图SIO手册及代码:
在这里插入图片描述

//Nct6106d_UARTA                                                                                                Nct6106d_write(2,0x30,0x01);                                                                                    Nct6106d_write(2,0x60,0x03);                                                                                    Nct6106d_write(2,0x61,0xf8);                                                                                    Nct6106d_write(2,0x70,0x4);                                                                                     Nct6106d_write(2,0xf0,0x2);

配置流程:

  • 1 通过0x30将UARTA进行功能Enable
  • 2 通过0x60,0x61将UARTA的该组寄存器映射到LpcIo的地址端口上,比如配置的0x3f8,那么如果我们想要访问UART控制器组的话,就需要通过UNCACHE_ADDR(0xefdfc000000+0x3f8)进行访问了,关于UART寄存器组都是按照协议规范定义的,可以正常使用标准协议驱动.
  • 3 通过0x70,我们来分配该UARTA的中断号. 在龙芯平台上, 中断号0-15已经分配给了Lpc下面的设备哦.
  • 4 通过0xf0,可以对UARTA进行时钟分频.

先写到这里,关于UARTA的配置及SIO的详细寄存器组我相信或多或少都有了解,所有的功能都大同小异,通过Lpc配置SIO,每款SIO芯片可能Access逻辑稍有区别,但是SIO内部的逻辑设备符合标准驱动模型.
有关该款Nct6106d的芯片手册见资源免费下载.


http://www.ppmy.cn/news/327772.html

相关文章

D17 K108-K161

K108 1.Array对象属性 2.定义和用法 3.push&#xff08;&#xff09; 该方法可以向数组的末尾添加一个或多个元素&#xff0c;并返回数组的新的长度 1&#xff09;可以将要添加的元素作为方法的参数传递 这些元素将自动添加到数组的末尾 <script>…

Python函数的默认参数和关键字参数(通过故事来学习)

曾经有一个小企鹅&#xff0c;他是一位烤饼师。他喜欢为他的朋友制作各种口味的烤饼。有些朋友只喜欢单一的口味&#xff0c;有些则喜欢在烤饼上加一些额外的材料。 有一天&#xff0c;他遇到了一只聪明的狐狸。狐狸告诉小企鹅可以使用可变参数来处理不同数量的口味和额外材料…

SCT2601TVBR、LMR16006XDDCR、MP2456GJ-Z参数

SCT2601TVBR P2P LMR16006XDDCR和MP2456GJ-Z SCT2601TVBR参数如下&#xff1a; 宽输入范围&#xff1a;4.5V-60V 高达0.6A的连续输出电流 0.765V2.5%反馈参考电压 集成500mΩ高压侧MOSFET 低静态电流为80uA 轻负载下的脉冲跳过模式&#xff08;PSM&#xff09; 最小接通…

组织列表-python

在你创建的列表中&#xff0c;元素的排列顺序常常是无法预测的&#xff0c;因为你并非总能控制用户提供数据的顺序。这虽然在大多数情况下都是不可避免的&#xff0c;但你经常需要以特定的顺序呈现信息。有时候&#xff0c;你希望保留列表元素最初的排列顺序&#xff0c;而有时…

【uni-app】使用uni-app实现简单的登录注册功能

文章目录 前言一、页面布局二、注册页面1.注册接口使用2.注册成功提示3.注册成功页面跳转4.完整代码 三、登录页面1.登录接口使用2.本地存储使用3.完整代码 总结 前言 大家好&#xff0c;今天和大家分享一下如何在uni-app中实现简单的登录注册功能。 首先你需要掌握一下知识点…

使用AIGC工具巧用Linux系统

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

【LIN通讯出现问题】

LIN信号发出了&#xff0c;但是没有收到响应的原因 如果你发送了LIN&#xff08;局域网互连&#xff09;信号&#xff0c;但没有收到响应&#xff0c;可能有以下几个原因&#xff1a; 线路故障&#xff1a;检查信号线路是否连接正确&#xff0c;可能存在接触不良、开路或短路等…

集成正态云和动态扰动的哈里斯鹰优化算法(IHHO)-附代码

集成正态云和动态扰动的哈里斯鹰优化算法(IHHO) 文章目录 集成正态云和动态扰动的哈里斯鹰优化算法(IHHO)1.哈里斯鹰优化算法2.改进哈里斯鹰优化算法2.1 正态云模型2.2 随机反向学习思想2.3 动态扰动策略 3.实验结果4.参考文献5.Matlab代码6.python代码 摘要&#xff1a; 针对基…