龙芯软件开发(24)-- PCI设备初始化2_龙芯pci中断绑定-程序员宅基地

技术标签: 嵌入式软件开发  

龙芯软件开发(24)-- PCI设备初始化2

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/caimouse/article/details/1483128
在汇编的代码里,已经进行了串口初始化,在这里更进一步初始化串口,它是通过调用下面的代码实现的:
#define SUPERIO_CFG_REG 0x85
上面定义南桥里串口寄存器地址。
 
static void initSerial(void)
{
    pcitag_t tag;
    char confval,val;
    /* 使能串口
     * 这个需要在汇编代码serialinit中设置
     * */
#define E2_EPP 2
#define E2_S1 (1<<2)
#define E2_S2 (1<<3)
#define E2_FLOPPY (1<<4)
    /* 配置super io*/
    tag=_pci_make_tag(VTSB_BUS,VTSB_DEV, VTSB_ISA_FUNC);
    confval=_pci_conf_readn(tag,SUPERIO_CFG_REG,1);
    _pci_conf_writen(tag,SUPERIO_CFG_REG,confval|2,1);  
上面根据 VT82C686B 来操作,主要是设置 SUPER IO 能配置,也就是设置 0x85 寄存器的第二位为 1 时为开始配置。根据 VT82C686B 的操作流程如下:
第一步,设置 0x85 寄存器的第二位的为 1 时可以配置。
第二步,写一个要操作的索引到 0x3F0 ,然后写配置的数据到 0x3F1 。当要配置多端口时,可以重复地写不同的索引和配置。
第三步,设置 0x85 寄存器的第二位的为 0 时结束配置。
 
 
#ifdef HIGH_SPEED_SERIAL
    linux_outb(0xee,0x3f0);
    val=linux_inb(0x3f1);
    linux_outb(val|0xc0,0x3f1); /* both ports on high speed*/
#endif
   
#if 0
    outb(PCI_IO_SPACE_BASE+0x3f0,0xe7);
    outb(PCI_IO_SPACE_BASE+0x3f1,(COM1_BASE_ADDR-PCI_IO_SPACE_BASE)>>2); /* com1 serial base address*/
 
    outb(PCI_IO_SPACE_BASE+0x3f0,0xe8);
    outb(PCI_IO_SPACE_BASE+0x3f1,(COM2_BASE_ADDR-PCI_IO_SPACE_BASE)>>2); /* com2 serial base address*/
#endif
 
    linux_outb(0xe2,0x3f0);
    val=linux_inb(0x3f1);
    linux_outb(val|E2_S2|E2_S1,0x3f1);
    _pci_conf_writen(tag,SUPERIO_CFG_REG,confval,1);
上面操作索引为 0xE2 ,设置的配置值的意思是打开并口为 EPP 模式,串口 1 和串口 2 打开,并且软驱打开。
 
    printf("0x3f8=%x/n",linux_inb(0x3f0));
上面显示 0x3F0 的值。
 
}
 
接着来看初始化键盘,
static void init_keyboard(void)
{
    pcitag_t tag;
    tag=_pci_make_tag(VTSB_BUS,VTSB_DEV, VTSB_ISA_FUNC);
    _pci_conf_writen(tag,0x5a,0xff,1);
}
上面是打开键盘和 RTC 的功能,打开声音功能,打开 SD 数据线 4—7 的信号为 1 。
 
接着下来,就是初始化 IDE 端口的功能了,在龙芯里 IDE 主要接硬盘和光驱。它的代码如下:
#define IDE_CHIPEN_REG 0x40
#define IDE_CFG_REG 0x41
static void initIDE(void)
{
    pcitag_t tag;
    char val;
    /* 南桥外设默认都是非使能状态,我们这里将其一一使能*/
    /* 硬盘使能*/
#if 1
       /* IDE controller enable */
       tag=_pci_make_tag(VTSB_BUS,VTSB_DEV, VTSB_ISA_FUNC);
       val=_pci_conf_readn(tag,0x48,1);
       val=val & ~2;
       _pci_conf_writen(tag,0x48,val,1);
上面打开 IDE 功能,由于南桥里定义 0 为使用,所以上面置第二位的值为 0 。
 
       /* IDE IRQ Route */
       val=_pci_conf_readn(tag,0x4a,1);
       val=(val&0xf0)|0x4;
       _pci_conf_writen(tag,0x4a,val,1);
上面设置第一个 IDE 使用 14 号中断源,第二个 IDE 使用 15 号中断源。
 
#endif
 
       tag=_pci_make_tag(VTSB_BUS,VTSB_DEV, VTSB_IDE_FUNC);
 
       /* enable IO space */
       _pci_conf_writen(tag,0x04,7,1);
       上面使用 IO 空间,使用内存空间并设置为总线主设备。
 
       /* set to compatible mode */
       _pci_conf_writen(tag,0x09,0x8A,1);
       上面全部设置为固定模式。也就是主 IDE 的命令寄存器是 0x1F0—0x1F7 ,从 IDE 的命令寄存器是 0x170—0x177 。
 
       /* latency */
       _pci_conf_writen(tag,0x0d,0xd0,1);
       上面设置 RTC 时钟使用 VBAT 电压。
 
       /* set to legacy interrupt */
       _pci_conf_writen(tag,0x3d,0x00,1);
       上面设置中断方式为一般方式。
 
 
       /* enable primary/secondary channel */
       _pci_conf_writen(tag,0x40,0xb,0x1);   
       上面打开 IDE 第一和第二通道。
 
 
       /* disable prefetch buffer & post write buffer */
       _pci_conf_writen(tag,0x41,0x2,0x1);   
       _pci_conf_writen(tag,0x43,0xa,0x1);   
       上面关闭所有 IDE 缓冲区,配置 FIFO 的最大值为一半。
 
 
       /* set zero wait state for master read/write
        * to make ict nb happy
        */
       _pci_conf_writen(tag,0x44,0x0,1); 
       上面设置读写等待信号为 0 电平。
 
 
 
       /* disable memory read multiple/memory write and invalidate
        */
       _pci_conf_writen(tag,0x45,0x0,1); 
       上面关闭内存读写多个命令。
 
#if 1
       _pci_conf_writen(tag, 0x10, 0x1f1,4);
       上面设置第一个 IDE 的命令基地址为 0x1F1.
 
       _pci_conf_writen(tag, 0x14, 0x3f5,4);
       上面设置第一个 IDE 的控制和状态寄存器的基地址为 0x3F5 。
 
       _pci_conf_writen(tag, 0x18, 0x171,4);
       _pci_conf_writen(tag, 0x1c, 0x375,4);
       上面设置第二个 IDE 的命令和状态基地址。
 
 
       _pci_conf_writen(tag, 0x20, 0xcc1,4);
       上面设置总线控制的基地址。
 
#endif
 
}
 
接着初始化中断控制,代码如下:
#define IRQ_ROUTE_REG1 0x51
#define IRQ_ROUTE_REG2 0x52
#define IRQ_ROUTE_REG4 0x55
#define IRQ_ROUTE_REG5 0x56
#define IRQ_ROUTE_REG6 0x57
#define PCI_IRQ_TYPE_REG 0x54
#define IRQ(x) x
#define PARALLEL_IRQ     (IRQ(7)<<4)
#define FLOPPY_IRQ       (IRQ(6))
#define COM1_IRQ     (IRQ(4))
#define COM2_IRQ     (IRQ(3)<<4)
#define PCIA_IRQ     (IRQ(10)<<4)
#define PCIB_IRQ     (IRQ(11))
#define PCIC_IRQ     (IRQ(12)<<4)
#define PCID_IRQ     (IRQ(13)<<4)
 
static void initIRQ(void)
{
    pcitag_t tag;
    char val;
    tag=_pci_make_tag(VTSB_BUS,VTSB_DEV, VTSB_ISA_FUNC);
   
    _pci_conf_writen(tag,IRQ_ROUTE_REG1,PARALLEL_IRQ|FLOPPY_IRQ,1);    上面启用并口和软盘中断。
 
   
    _pci_conf_writen(tag,IRQ_ROUTE_REG2,COM2_IRQ|COM1_IRQ,1);  
    上面启用串口 1 和串口 2 中断。
 
 
    val=_pci_conf_readn(tag,IRQ_ROUTE_REG4,1);
    val &=0xf;
    val |=PCIA_IRQ;
    _pci_conf_writen(tag,IRQ_ROUTE_REG4,val,1);  
    上面配置 PCI 的 A 插槽的中断为 10 号。
 
 
    _pci_conf_writen(tag,IRQ_ROUTE_REG5,PCIC_IRQ|PCIB_IRQ,1);  
    上面设置 B,C 的中断号 11 , 12 。
 
    val=_pci_conf_readn(tag,IRQ_ROUTE_REG6,1);
    val &=0xf0;
    val |=PCID_IRQ;
    _pci_conf_writen(tag,IRQ_ROUTE_REG6,val,1);  
    上面设置 D 的中断为 13 。
 
 
    val=_pci_conf_readn(tag,PCI_IRQ_TYPE_REG,1);
    val &= 0xf0;
    _pci_conf_writen(tag,PCI_IRQ_TYPE_REG,PARALLEL_IRQ|FLOPPY_IRQ,1);  上面设置为低电平中断模式。
 
}
 
这样就初始化中断源了。接着就启用 IO 的功能,如下:
static void enable_io_decode(void)
{
    pcitag_t tag;
    char val;
    tag=_pci_make_tag(VTSB_BUS,VTSB_DEV, VTSB_ISA_FUNC);
    /*enable on-board io*/
    val=_pci_conf_readn(tag,0x81,1);  
    _pci_conf_writen(tag,0x81,val|0x80,1);
    /*enable com1 and com2*/
    _pci_conf_writen(tag,0x83,0x80|0x1| 0x8,1);  
}
 
经历上面很多寄存器的初始化,才把南桥的功能设置完成。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44936219/article/details/102703607

智能推荐

c语言和汇编语言同时编辑跑马灯,单片机汇编语言跑马灯.docx-程序员宅基地

文章浏览阅读431次。单片机汇编语言跑马灯实验一 跑马灯-亮灯左移右移循环黄天佑 20132301155一、实验目的1、进一步熟悉keil C仿真软件及单片机实验板的使用。2、 了解并熟悉单片机I/O口和LED灯的电路结构,学会构建简单的流水灯电路。3、掌握应用KEIL软件编辑、编译源汇编程序的操作方法。4、了解单片机汇编语言程序的设计和调试方法。二、实验原理1、实验板硬件电路图2、单片机流水灯程序设计(1)流水灯程序...

python交换两个变量的值_python交换两个变量的值方法-程序员宅基地

文章浏览阅读2.7k次。python交换两个变量的值方法大部分语言,例如c语言,交换两个变量的值需要使用中间变量。例如交换a,b伪代码:tmp = aa = bb = tmppython里面可以实现无临时变量的交换(a,b) = (b,a)对于它的交换原理我深感好奇,因为这意味着python解释器很有可能做了件更多的工作。如果说变量可以直接交换,那么列表的元素呢?lists[i], lists[j] =lists[j],..._编写程序实现交换两个变量的值python

修改vs2005,vs2008,vs2010调试默认浏览器(转自:http://hi.baidu.com/iaskall/blog/item/17c05a60b35f0551eaf8f803.htm)_803.htm8-程序员宅基地

文章浏览阅读7k次。在用VS2005开发asp.net时,一按F5,默认使用IE打开待调试的网站,但最近安装VS2010后,用VS2010开发asp.net时,一按F5,默认使用Chrome打开待调试网站,甚是不习惯(尽管我平时一直使用Chrome上网,但真正开发起来,还是得跟着IE走不是?!万恶的微软!)。后来在网上找了下,说是需要设置aspx的默认打开浏览器。前些日子不小心安装上了一个sogou的浏览_803.htm8

【BZOJ3889】【Usaco2015 Jan】Cow Routing 双键值最短路_usaco2015jan-程序员宅基地

文章浏览阅读1.6k次。题意:从样例讲起。 第一行 s,t,m表示:起点,终点,m条航线。然后m组,每组第一行len,n表示这条航线的代价, 这类似于公交车,只要用了就花这些钱,但是用多少都这些钱。 注意是单向边。举例: 2333 4 3 2 1 4 就是3->2、3->1、3->4、2->1、2->4、1->4都花2333元。这个花销是第一键值。 第二键值是经过几站。比如3->2->_usaco2015jan

b站解除港澳台限制 油猴脚本 无法授权 找不到IP地址_解除b站区域限制账号授权失败-程序员宅基地

文章浏览阅读2.1w次。b站解除港澳台限制油猴脚本 无法授权 找不到IP地址可以的话请跳过这段废话问题描述解决方案可以的话请跳过这段废话作为一个总是看些奇怪动画片的阿宅,睿站的视频码率虽然差,但是胜在方便。这个脚本过于伟大。而且它适用于海外用户。脚本如何安装请看这里但是这个脚本总是喜欢抽风,这次在前人的提示和自己的尝试之下,成功解决问题。本着我为人人,人人为我的原则,特地把方法写在这里,让百度也搜到。不保证通用,仅解决了我遇到的这次问题。问题描述本次抽风在于,无法观看番剧区动画(原因应该是我的ip在11区)以及b站国_解除b站区域限制账号授权失败

c语言标准函数库_bf-numofsignificantdigitsafterdecimalpoint-程序员宅基地

文章浏览阅读426次。  void assert(int expression);   Macro used for internal error detection. (Ignored if NDEBUG_bf-numofsignificantdigitsafterdecimalpoint

随便推点

前台和后台互相传递数组_后台怎么传输array数组-程序员宅基地

文章浏览阅读8.6k次。前台和后台互相传递数组  最近做项目要用到将多个字符串通过jq的ajax传递给后台的功能,刚开始是想将字符串以某个分隔符的形式拼接起来再进行传递,如:$.ajax{ url:"xxxx", data:{ array: "Jason,Sean,Danny" }}  然后后台获取参数后再分隔,这种做法有很不好,如果你需要的参数里面包含分隔符..._后台怎么传输array数组

Stegosuite,图片隐写术-程序员宅基地

文章浏览阅读1.3k次。参考:https://www.youtube.com/watch?v=iUNUjqSXWj0https://stegosuite.org/https://pixabay.com/https://dev.stegosuite.org/Stegosuite/Stegosuite/这个工具是Java写的,开源工具。支持的工作环境:Debian / Ubuntu..._stegosuit

asp出现的问题 Microsoft JET Database Engine 错误 '80004005'-程序员宅基地

文章浏览阅读808次。好久都没使用asp了,今天有个朋友说让我帮调个东西。iis设置好之后一直出现:Microsoft JET Database Engine 错误 '80004005'未指定的错误在上网搜索了一下,发现还有一个目录要给用户IUSR_QIUYISTUDIO有写的权限的,就是%SystemRoot%\Temp(即默认安装系统情况下的C:\Windows\Temp)目录,原来ASP.NET的权限问题也是要给...

python整除_python 整除,取余都是向下取整-程序员宅基地

文章浏览阅读251次。原博文2020-06-10 19:37 −10//3=3,10%3=1, -10//3=-4.-10%3=2, divmod(x,y)返回取整及余数 divmod(10,3) 返回3,1print(0.1+0.1+0.1-0.3) 打印出来的不是0.0 需要 import Decimal ,print(Decima...相关推荐2019-09-28 21:13 −Python python是一种..._python 10除3输出4

DAP调试适配协议_dap协议-程序员宅基地

文章浏览阅读1.7w次,点赞5次,收藏26次。DAP调试适配协议什么是 DAP 协议DAP 即调试适配协议( Debug Adapter Protocol ),顾名思义,它是用来对多种调试器进行抽象统一的适配层,将原有 IDE 和调试工具直接交互的模式更改为和 DAP 进行交互。该模式可以让 IDE 集成多种调试器变得更简单,且灵活性更好。在 IDE 中的调试功能有许多小功能组成,包括单步执行、断点、查看变量值等,常规的实现方式是在每个 IDE 中去实现这些逻辑,且因为调试工具的接口不同,还需要为每个调试工具做一些适配工作,这将导致大量且重复的工_dap协议

一加6可以刷的rom_一加6刷机包-程序员宅基地

文章浏览阅读1.5k次。详情一加6刷机包是一款专门用于一加手机刷机的辅助工具,这款软件大大提升了系统的流畅性,实用性也得到了很大的提升,该工具剔除了繁琐的操作,让用户能够轻松上手。赶快来下载吧!一加6刷机包软件介绍一加6刷机包是一款安卓刷机软件,这款软件真正实现了一键式操作,用户轻松上手。该软件也大大加强了个人资料的保护,使用户更加放心,该软件更加流畅,提供多种ROM,轻松快速下载。刷机前准备(1)手机电量充足,建议50..._一加6 卡刷包 博客

推荐文章

热门文章

相关标签