0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术精简ISA总线Linux编程–Part1

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-02-07 11:19 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

精简ISA总线接口是一种8-bit宽度的双向并行扩展总线,其特点是地址数据分时复用8-bit总线,加上4条总线控制信号,即可实现对外部数据的快速读写。若再使能一条总线时钟信号(共13条信号),就可实现高达10MB/s的数据传输。精简ISA总线作为英创主板的特色功能之一,在ESM6802、ESM7000、ESM7100、ESM335x等多款型号中均有配置。

对精简ISA总线接口的应用编程,将通过3个部分分别加以介绍。本文是第一部分,主要介绍ISA总线的访问模式,以及最基本的总线数据读写。第二部分介绍由应用程序启动基于DMA的数据块读写。采用DMA方式实现数据库读写,可有效降低CPU的负载率。第三部分介绍ISA扩展硬件触发DMA数据传输的方法,该方法主要面向工业控制领域的高速数据采集。由于采用硬件触发的DMA传输机制,使得前端的高速AD单元不再采用昂贵的高速SRAM做数据缓冲,从而使采集单元的成本大幅度下降。该方法可实现高达5MB/s(每秒5兆字节)以上的数据采集率。

ISA总线信号定义如下:

信号及说明 PIN# 信号及说明
RESET_B,硬件复位 1 2 ISA_ADVn,地址锁存控制信号
ISA_AD0,地址数据总线,LSB 3 4 ISA_AD4,地址数据总线
ISA_AD1,地址数据总线 5 6 ISA_AD5,地址数据总线
ISA_AD2,地址数据总线 7 8 ISA_AD6,地址数据总线
ISA_AD3,地址数据总线 9 10 ISA_AD7,地址数据总线,MSB
MSLn,支持多模块挂接总线 11 12 ISA_WEn,数据写控制信号
GPIO9,可选作为IRQ 13 14 ISA_RDn,数据读控制信号
GPIO8,可选作为IRQ 15 16 ISA_CSn,片选控制信号
GPIO25,可选作为IRQ 17 18 VDD_5V0,+5V供电
GPIO24 / ISA_BCLK,同步时钟ISA_BCLK 19 20 GND,电源信号地

本文以下部分,将以ESM7000 Linux平台为例,介绍具体的编程方法。

ISA总线操作模式

精简ISA总线的宽度只有8-bit,因此它的地址寻址范围也只有8-bit,即0x00 – 0xFF。ISA总线的驱动程序支持应用程序使用不同的地址范围,来区别不同的访问类型。根据ISA地址可有如下6种类型:

模式 offset ISA总线操作
0 0x0000 … 0x00FF 异步总线周期,CPU操作
1 0x1000 … 0x10FF 异步总线周期,MemCpy方式DMA,固定端口地址
2 0x2000 … 0x20FF 异步总线周期,外部信号触发方式DMA,固定端口地址
3 0x3000 … 0x30FF 同步总线周期,CPU操作,要求ISA端口地址16字节对齐
4 0x4000 … 0x40FF 同步总线周期,MemCpy方式DMA,同步译码端口
5 0x5000 … 0x50FF 同步总线周期,外部信号触发方式DMA,同步译码端口

ISA总线的异步总线周期是指每个总线周期读写一个字节,只需用到ISA最基本的12条信号线;而同步总线周期则需要使用总线时钟信号(共13条信号线),可实现一个总线周期读写4个字节。在《在英创工控主板上实现高速工控数据采集》一文中有对异步总线周期时序和同步总线周期时序较详细的介绍。

由iMX7DSDMA(Smart DMA)控制器特性决定,ESM7000可支持的ISA总线操作类型如下:

模式 offset ISA总线读操作
0 0x0000 … 0x00FF 异步总线周期,CPU读,inc仅对本模式有效
3 0x3000 … 0x30FF 同步总线周期,CPU读,要求ISA端口地址16字节对齐
4 0x4000 … 0x40FF 同步总线周期,MemCpy方式DMA读,同步译码端口
5 0x5000 … 0x50FF 同步总线周期,外部信号触发方式DMA读,同步译码端口
模式 offset ISA总线写操作
0 0x0000 … 0x00FF 异步总线周期,CPU写,inc仅对本模式有效
3 0x3000 … 0x30FF 同步总线周期,CPU写,要求ISA端口地址16字节对齐
4 0x4000 … 0x40FF 同步总线周期,MemCpy方式DMA写,同步译码端口

同步总线周期主要用于数据的高速传送,因此采用固定数据端口。数据端口的译码则采用直接识别同步总线周期的方法,而不再采用对总线地址译码的方法。异步总线周期则主要用于扩展电路单元内各寄存器的控制。

采用DMA进行ISA总线数据传送的目的,是为了降低高速传送大量数据时的CPU开销,使系统在进行高速数据采集的同时,还能进行其他的必要操作。MemCpy方式的DMA是指软件线程启动DMA,然后该线程挂起等待DMA操作完成。在多线程环境中,其他线程即可在DMA执行过程中得以并行运行。MemCpy方式DMA的具体情况将在《精简ISA总线编程– Part 2》中介绍。硬件触发DMA,为低成本实现高速数据采集提供了技术手段,将在《精简ISA总线编程– Part 3》中介绍相关的采集时序和程序实现。

表格中的offset项,是指在程序设计中使用的数据结构struct isa_transfer的成员,其结构如下:

structisa_transfer
{
void *rx_buf; /* != NULL: buffer for bus read */
void *tx_buf; /* != NULL: buffer for bus write */
unsigned len; /* buffer length in byte */
unsigned offset; /* offset,port address on isa bus */
unsigned inc; /* = 0: fixed offset, = 1: offset+1 after r/w */
};

每一个总线周期的操作只能是读或写,因此在isa_transfer结构中只能有一个buffer指针不为NULL。

ISA总线访问API

对ISA总线硬件端口的基本访问方法,包含在isa_api_v3.cpp文件中,如下所示:

#include
#include
#include
#include
#include
#include
#include"em335x_drivers.h"
unsignedchar *isa_base = NULL;
unsignedintmap_size = 4096;
// return >= 0: return file handle
// return < 0: return failed code
intisa_open()
{
intfd;
fd = open("/dev/em_isa", O_RDWR);
if(fd< 0)
{
returnfd;
}
isa_base = (unsignedchar*)mmap(0,map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (isa_base == MAP_FAILED) {
printf("%s mmap failed\n", __func__);
isa_base = NULL;
close(fd);
return -1;
}
returnfd;
}
intisa_close(intfd)
{
if(isa_base != NULL) {
munmap(isa_base, map_size);
isa_base = NULL;
}
returnclose(fd);
}
// offset: port address in isa bus
unsignedcharisa_read(intfd, unsignedint offset)
{
unsignedcharval_b;
int rc;
offset&= 0xff;
if(isa_base != NULL) {
unsignedshortintval_w;
val_w = *((unsignedshortint*)(isa_base + (offset << 1)));
val_b = (unsignedchar)(val_w& 0xff);
returnval_b;
}
val_b = offset;
rc = read(fd, &val_b, sizeof(unsignedchar));
if(rc< 0)
{
// read error
printf("%s failed %d\n", __func__, rc);
}
returnval_b;
}
// offset: port address in isa bus
voidisa_write(intfd, unsignedint offset, unsignedcharval_b)
{
unsignedshortintval_w;
int rc;
offset&= 0xff;
if(isa_base != NULL) {
val_w = val_b;
*((unsignedshortint*)(isa_base + (offset << 1))) = val_w;
return;
}
val_w = ((offset & 0xff) << 8) | val_b;
rc = write(fd, &val_w, sizeof(unsignedshortint));
if(rc< 0)
{
// read error
printf("%s failed %d\n", __func__, rc);
}
}
// offset: port address in isa bus
unsignedshortintisa_read16(intfd, unsignedint offset)
{
unsignedshortintval_w;
int rc;
// 2-byte alignment is required for offset
offset&= 0xfe;
if(isa_base != NULL) {
unsignedintval;
val = *((unsignedint*)(isa_base + (offset << 1)));
val_w = (unsignedshortint)((val>> 8) | (val& 0x00ff));
returnval_w;
}
val_w = (unsignedshortint)offset;
rc = read(fd, &val_w, sizeof(unsignedshortint));
if(rc< 0)
{
// read error
printf("%s failed %d\n", __func__, rc);
}
returnval_w;
}
// offset: port address in isa bus
voidisa_write16(intfd, unsignedint offset, unsignedshortintval_w)
{
unsignedintval;
intrc;
// 2-byte alignment is required for offset
offset&= 0xfe;
if(isa_base != NULL) {
val = val_w;
val = ((val<< 8) & 0x00ff0000) | (val& 0x000000ff);
*((unsignedint*)(isa_base + (offset << 1))) = val;
return;
}
val = (offset << 16) | val_w;
rc = write(fd, &val, sizeof(unsignedint));
if(rc< 0)
{
// read error
printf("%s failed %d\n", __func__, rc);
}
}
intisa_read_buf(intfd, structisa_transfer *tp)
{
int rc;
rc = read(fd, tp, sizeof(structisa_transfer));
if(rc< 0)
{
// read error
printf("%s failed %d\n", __func__, rc);
}
returnrc;
}
intisa_write_buf(intfd, structisa_transfer *tp)
{
int rc;
rc = write(fd, tp, sizeof(structisa_transfer));
if(rc< 0)
{
// read error
printf("%s failed %d\n", __func__, rc);
}
returnrc;
}

函数isa_open(..)和isa_close(..)是打开关闭ISA驱动的设备节点。为了提高应用程序访问ISA硬件寄存器的速度,ISA驱动实现了mmap功能,使isa_read(..)、isa_write(..)、isa_read16(..)和isa_write16(..)这4个函数可在用户空间直接操作ISA总线上的硬件寄存器,大大提高了代码的执行速度。注意若在多个线程中均有调用isa_api_v3.cpp的函数时,需要加互斥锁,保证对硬件资源操作的完整性。

CPU字节/字读写

函数isa_write(fd, 0x40, 0x55)是向地址为0x40的寄存器写入单个字节0x55,对应的总线时序为:

时序图显示了8位总线的地址/数据复用,地址需利用ADV#信号锁存。

函数isa_read(fd, 0x40)是从地址为0x40的寄存器读取单个字节,对应的总线时序为:

在上述时序中,ISA总线悬空,没有接具体的外围设备,因此由于分布电容的作用,在数据时段总线继续保持前面输出的地址0x40,读取的数据也会是0x40。若此时有外围设备输出数据至总线上,该数据则会被系统读取。

函数isa_write16(fd, 0x40, 0xaa55)是向地址为0x40的字寄存器写入16-bit字0xaa55,对应的总线时序为:

从时序图可见,16-bit数据写被分成两个连续的总线周期,其中低位字节0x55写入地址0x40寄存器,高位字节0xaa写入地址0x41寄存器。为了尽可能缩短2个周期的间隔,要求地址必须是偶对齐。

函数isa_read16(fd, 0x40)是从地址为0x40的字寄存器读取16-bit字,对应的总线时序为:

同样由于悬空总线的分布电容的作用,读取的数据会是0x4140。

CPU数据块读写

为了提高数据传输速度,对数据块操作,推荐采用同步总线周期。在ESM7000 Linux版本中,每个同步总线周期可传送4个字节。为了进一步加快数据块的传送,在驱动中使用了ARMv7的汇编块指令来支持16字节以上的数据传输。因此强烈建议数据块传输长度选择为16字节的整倍数,其数据端口占用16个ISA地址,即只对高4位地址译码。

进行数据块读写需要用到structisa_transfer传递相关参数。以下是执行32字节数据块写的代码,写入地址为0x3040。顺序的数据可方便时序的观察。

unsignedchargbuf[64 * 1024];
unsignedint i, value;
structisa_transfer t;
unsignedchar *pBuf8;
// write data block
memset(&t, 0, sizeof(structisa_transfer));
t.offset = 0x3040;
t.len = 32;
t.tx_buf = gbuf;
// fill data
value = 0x55; // initial value
pBuf8 = (unsignedchar*)t.tx_buf;
for(i = 0; i
*pBuf8 = (unsignedchar)(value + i);
pBuf8++;
}
isa_write_buf(fd, &t);

对应的总线时序说明如下:

上图可见,32个字节分成了8个总线周期完成,大致的总线速率为13MB/s。展开上述时序可看到:

总线上的数据0x55、0x59、…... 0x6D、0x71是每个总线周期CPU送出的第一个数据,保持3个时钟节拍,所以可在示波器中显示出来。进一步展开可看到:

ISA扩展单元可根据上述时序来支持高速的同步总线周期读写逻辑电路,其要点包括:

●每个周期的第一个BCLK下降沿ADV#有效,标志同步周期的开始,之后连续7个BCLK下降沿后同步周期结束。

●第一个总线周期地址为输入地址,之后每个总线周期的地址+4,按16模循环。因此要求数据端口占用16个ISA地址。

●BCLK频率30MHz,从第5个上升沿开始锁存数据,连续4个数据。没有BCLK时输出的数据没有意义,不影响正常的数据传输。

以上是对精简ISA总线基本读写的介绍,有兴趣的客户可与英创公司技术联系,索取测试代码源码。技术支持邮箱:support@emtronix.com。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11628

    浏览量

    217971
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6107

    浏览量

    36950
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    龙芯中科助力2025教育信息技术应用创新大赛成功举办

    2025年11月13日-15日,由中国教育技术协会主办、浙江大学与中国教育技术协会网络安全专业委员会联合承办,中国电子工业标准化技术协会信息技术应用创新工作委员会、浙江高校信
    的头像 发表于 11-21 16:23 593次阅读

    诚迈科技信电脑助力2025第二届教育信息技术应用创新大赛圆满收官

    11月15日,由中国教育技术协会主办、浙江大学与中国教育技术协会网络安全专业委员会联合承办,中国电子工业标准化技术协会信息技术应用创新工作委员会、浙江高校信
    的头像 发表于 11-17 17:58 341次阅读
    诚迈科技信<b class='flag-5'>创</b>电脑助力2025第二届教育<b class='flag-5'>信息技术</b>应用创新大赛圆满收官

    OBOO鸥柏|信触摸一体机兆芯115寸Linux国产系统技术智造

    BOO鸥柏信触摸一体机:兆芯115寸Linux智造新标杆在信息技术应用创新浪潮中,【OBOO鸥柏】推出的信触摸一体机以其卓越性能和智能化设计,成为行业数字化转型的重要工具。这款搭载
    的头像 发表于 11-16 15:44 456次阅读
    OBOO鸥柏|信<b class='flag-5'>创</b>触摸一体机兆芯115寸<b class='flag-5'>Linux</b>国产系统<b class='flag-5'>技术</b>智造

    宝马南京信息技术有限公司开业

    今日,宝马(南京)信息技术有限公司在南京正式“挂牌运行”。这家华晨宝马全资子公司由领悦数字信息技术有限公司南京分公司“迭代”而来,代表着一次里程碑式的“进化”。这次升级不仅加速了宝马在华数字化转型进程,更通过深化本土创新,为“未来智慧出行”的发展谱写了核心“代码”。
    的头像 发表于 10-29 15:17 404次阅读

    易华录入选国家级信息技术应用创新典型解决方案

    近日,工业和信息化部网络安全产业发展中心(工业和信息化部信息中心)公布了“2024年信息技术应用创新解决方案”评选结果。易华录申报的“基于节能高效蓝光的超级智能存储解决方案”凭借显著的
    的头像 发表于 08-07 15:35 1250次阅读

    信息技术应用产学协同人才培养行动计划”正式发布,诚迈科技入选首批参与单位

    设在中国软件评测中心。诚迈科技作为信技术先锋企业,受邀成为首批参与单位,与国内顶尖高校、领军企业和权威机构携手,共同打造具有中国特色的信息技术人才培养新范式,为
    的头像 发表于 08-06 17:29 1321次阅读
    “<b class='flag-5'>信息技术</b>应用产学协同人才培养行动计划”正式发布,诚迈科技入选首批参与单位

    佛瑞亚如何通过信息技术推动业务增长

    在数字化、信息化的浪潮下,信息技术已经不仅是后台工具,更成为驱动企业发展的关键力量。本期Women Inspiring Mobility,我们采访了佛瑞亚中国区信息技术总监马瑛,了解她和团队如何将
    的头像 发表于 07-29 14:00 729次阅读

    飞腾主板为信产业发展提高硬实力

    信息技术飞速发展的当下,信产业已成为我国实现科技自立自强、保障国家信息安全的关键领域。信,即信息技术应用创新,其核心目标是实现
    的头像 发表于 07-22 18:20 560次阅读

    DEKRA德凯成为沙特通信和信息技术设备技术法规认证机构

    近日,DEKRA德凯成功获得沙特标准、计量和质量组织(SASO)认可,正式成为沙特通信和信息技术设备技术法规(Technical Regulation for Communications
    的头像 发表于 07-15 14:27 729次阅读

    科普|信是什么?一文读懂“信息技术应用创新”战略

    什么是信?信,即“信息技术应用创新”,是国家推动IT系统自主可控、安全可控的重要战略工程。它不仅是技术层面的创新,更承载着保障国家网络安全、推动产业升级和实现数字主权的重任。简单来
    的头像 发表于 06-13 10:06 6297次阅读
    科普|信<b class='flag-5'>创</b>是什么?一文读懂“<b class='flag-5'>信息技术</b>应用创新”战略

    龙芯中科荣获2024年度信息技术应用创新工作委员会卓越贡献成员单位

    近日,中国电子工业标准化技术协会信息技术应用创新工作委员会(以下简称“信工委会”)在北京召开2024年度工作总结座谈会暨信“大比武”总结大会。中国工程院院士、信
    的头像 发表于 01-23 10:50 981次阅读

    芯盛智能荣获2024年信息技术应用创新工作委员会卓越贡献成员单位

    日前,中国电子工业标准化技术协会信息技术应用创新工作委员会(以下简称 “信工委会”)2024 年度总结座谈会于北京隆重举行。此次会议对在信工作中作出突出贡献的成员单位予以表彰。江苏
    的头像 发表于 01-20 09:56 929次阅读

    飞腾助力首届教育信息技术应用创新大赛圆满落幕

    近日,由中国教育技术协会主办,教育部教育管理信息中心教育信实验室、公安部第三研究所、中国电子工业标准化技术协会信工委会支持,北京航空航天
    的头像 发表于 12-24 09:57 768次阅读

    有方科技参编的信息技术团体标准发布

    近日,有方科技参编的《信息技术产品供应链成熟度 共性指标 第1部分:企业背景评价》《信息技术产品供应链成熟度 共性指标 第2部分:技术掌控评价》《
    的头像 发表于 12-23 10:44 901次阅读

    龙芯中科助力2024首届教育信息技术应用创新大赛成功举办

    近日,2024首届教育信息技术应用创新大赛在北京航空航天大学成功举办。本次大赛由中国教育技术协会主办,教育信实验室、公安部第三研究所、中国电子工业标准化技术协会信
    的头像 发表于 12-19 17:02 821次阅读