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

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

3天内不再提示

英创信息技术ESM335x扩展总线中断智能块读写

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

扫码添加小助手

加入工程师交流群

1、综述

ESM335x 嵌入式主板的提供带中断的精简ISA扩展总线,主要用于支持高速数据采集、多路串口扩展以及其他的高级扩展应用。在这些应用中,往往出现需要按一定的顺序读写一定量的数据的情况,如果用户在应用程序中一次一次的调用读写操作将会很慢而且会占用较多系统资源。我们在Linux-4.1.6 ISA总线驱动增加了中断时数据块读写操作的功能,当有中断发生时,驱动程序会按照用户的设置读写块数据,并将读到的数据进行缓存,读写完之后驱动程序会通知应用程序,用户在应用程序中通过读操作就能获得需要读取的块数据。使用驱动程序在中断时自动读写能简化用户应用程序,减少块读写操作的延迟。具体的使用方法在下面介绍。

2、数据结构及使用说明

使用发生中断时驱动自动读写数据块功能需要在应用程序中使用em335x_drivers.h头文件,使能功能需要使用struct isa_transfer结构体,传入此结构体数组给驱动以设置读写操作的参数:

structisa_transfer

{

constvoid *tx_buf; /* 写数据地址,不为NULL有效 */

void *rx_buf; /* 读数据地址,不为NULL有效 */

unsigned len; /* 读取长度 */

unsigned offset; /* 总线地址 0x00 .. 0xFF */

unsigned inc; /* 每次读写之后地址的增量 */

};

●tx_buf: 不为NULL时, 表示写操作

●rx_buf: 不为NULL时,表示读操作,数据读取存放地址

●tx_buf和rx_buf不能同时有效

●len:读写长度,以字节byte为单位,进行块读写操作时必须为偶数,也可以进行单独的1个byte的数据读写,即设置为1

●offset:读写操作地址,块数据读写时offset必须为偶数

●inc:每次读写操作后地址增加量,1或者0

总线块数据读写说明

ESM335x精简ISA总线只有8位数据/地址线,但是硬件内部可以进行16bit的读写,并且会自动将16bit的数据分为低8位和高8位两次读写,低8位和高8位处在连续的地址处(即必须有两个相邻的地址),我们在驱动中为了加快读写操作,在用户进行块读写(结构体中的len为偶数)时会使用16bit读写的方式,具体读写方式如下,请用户注意读写地址的变化:

●设置rx_buf有效,len=4, offset=0, inc=0时,驱动读写地址及顺序为:

低8位—offset,高8位—offset+1;低8位—offset,高8位—offset+1。

●设置rx_buf有效,len=4, offset=0, inc=1时,驱动读写地址及顺序为:

低8位—offset,高8位—offset+1;低8位—offset+2,高8位—offset+3。

写操作相同。

3、应用程序示例

使用ISA总线需要先打开相应的设备文件:

intfd;

fd = open("/dev/em335x_isa", O_RDWR);

printf("open file = %d\n", fd);

if(fd < 0)

{

returnfd;

}

应用程序需要先初始化要传递给驱动的struct isa_transfer数组,读写顺序和数组中的顺序相同,用户可自行设定,要使用中断自动读写功能数组第一个元素必须初始化为0,否则将直接进行块读写操作,而不使用中断:

#defineARRAY_SIZE(a) (sizeof(a)) //用于计算数组字节数

uint8_t tx[2] = { 0x5a, 0x55}; //第一次写入数据

uint8_t tx2[2] = { 0xaa, 0x1b}; //第二次写入数据

uint8_t rx[8]; //读取数据存放处

structisa_transfer tr[4];

//第一个元素必须设置为0才会使能中断自动读写功能

memset ( &tr[0], 0,sizeof(structisa_transfer) );

//第一次操作设置为写

tr[1].tx_buf = tx;

tr[1].rx_buf = NULL;

tr[1].len = ARRAY_SIZE(tx);

tr[1].offset = 0;

tr[1].inc = 1;

//第二次操作设置为读,应用程序中读操作存放数据地址rx,总线起始地址为offset

tr[2].tx_buf = NULL;

tr[2].rx_buf = rx;

tr[2].len = ARRAY_SIZE(rx) ;

tr[2].offset = 4;

tr[2].inc = 0;

//第三次操作设置为写

tr[3].tx_buf = tx2;

tr[3].rx_buf = NULL;

tr[3].len = ARRAY_SIZE(tx2);

tr[3].offset = 0;

tr[3].inc = 1;

调用ioctl函数传递数组地址,使能中断块读写操作:

ret = ioctl(fd, ISA_IOC_MESSAGE(4), tr );

设置过后的读取地址必须保证在下次调用ioctl重新设置之前一直有效,用户之后调用read函数时驱动程序会自动将数据写入设置的读取地址(示例中的rx数组),而与用户在read函数中输入的地址无关,这样能够简化用户应用程序中的设置,用户只需要在每次read函数之后到ioctl传递的结构体数组中的读地址处(rx数组)获得数据,并在下次读操作之前进行拷贝或者其他操作以防止数据丢失。

停止中断块读写操作,只传入一个全为0的struct isa_transfer机构体:

ret =ioctl(fd, ISA_IOC_MESSAGE(1), &tr[0] );

read函数读取数据只需以sizeof(struct isa_transfer)为count参数,地址为无关参数,但是建议用户传入之前ioctl处的结构体数组地址,如下所示,之后数据便会读到之前设置的结构体数组中指定的读取数据存入地址处,即rx数组中:

nNum =read(fd, tr,sizeof(structisa_transfer));

需要重新设置读写数据参数时需要重新设置结构体数组,并重新调用ioctl函数。

设置完成后使用select函数查询ISA总线状态,如有中断发生,并且驱动读写完了设置的数据块,select函数将会返回大于0的数值,并且设置相应的读文件标志,应用程序就可以调用read读取数据了,select函数用法示例:

//线程函数中调用select函数查询总线状态,如可读,则调用read读取数据到之前设置的地址

intISASelectThreadFunc(void* lparam)

{

intfd = * (int*)lparam;

printf( "fd %d\n", fd );

fd_set fdRead;

structtimeval aTime;

intret;

while(1)

{

FD_ZERO(&fdRead);

FD_SET(fd,&fdRead);

aTime.tv_sec = 2;

aTime.tv_usec = 0;

ret = select ( fd+1, &fdRead, NULL, NULL, &aTime );

if( ret<0 )

printf( "select, something wrong!\n " );

if( ret>0 )

{

if( FD_ISSET(fd, &fdRead) )

{

printf( "There is a IRQ!!! AND RW complete!\n" );

/********************在此调用read************************/

read(fd, &tx[0],sizeof(structisa_transfer));

//数据已经读到rx数组中了,用户可在此进行数据处理

}

}

//判断程序运行状态,跳出循环

//break;

}

pthread_exit( NULL );

return0;

}

//创建线程

intStartPulseThread(int*fd )

{

pthread_attr_t attr;

pthread_t m_thread;

int res;

res = pthread_attr_init(&attr);

if( res!=0 )

{

printf("Create attribute failed\n" );

}

res = pthread_attr_setscope( &attr, PTHREAD_SCOPE_SYSTEM );

res += pthread_attr_setdetachstate( &attr, PTHREAD_CREATE_DETACHED );

if( res!=0 )

{

printf( "Setting attribute failed\n" );

}

res = pthread_create( &m_thread, &attr, (void*(*) (void*))&ISASelectThreadFunc, fd );

if( res!=0 )

{

return-1;

}

pthread_attr_destroy( &attr );

return0;

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

    关注

    88

    文章

    11628

    浏览量

    217928
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6107

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2025第二届教育信息技术应用创新大赛正式开赛

    为进一步落实建设网络强国和教育强国的战略部署,推动各级教育行政部门及高校信息技术应用创新能力提升,培养实战型创新人才。龙芯中科联合太初元碁、诚迈科技在2025第二届教育信息技术应用创新大赛共同发布信息技术应用创新人工
    的头像 发表于 05-13 16:21 1270次阅读

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

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

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

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

    中科曙光南京研究院方案入选江苏省信息技术创新优秀解决方案

    对中科曙光南京研究院在信息技术应用创新领域深厚实力的有力证明,更是对其持续推动技术创新、优化解决方案能力的广泛认可。该方案集成了高端计算与分布式存储的先进技术,旨在为用户提供高效、稳定、可扩展
    的头像 发表于 01-08 15:41 927次阅读

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

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

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

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

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

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