5142|4

9

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

串口大概能用了,表现一下。 [复制链接]

我想在fpga上开个串口,de0的串口不够用,开始一直以为qsys里面的uart和Linux里面的altr uart1.0对应,所以就想着是dts写的不对,quartus15产生的dts在这里少个东西:
                hps_0_rstmgr: rstmgr@0xffd05000 {
                        compatible = "altr,rst-mgr", "syscon";
                        reg = <0xffd05000 0x00000100>;
                }; //end rstmgr@0xffd05000 (hps_0_rstmgr)

少了 "syscon";
后来看驱动代码觉得不对劲,寄存器数量不一样多,fpga里面的IP只有2个,点帮助文档看到的。查了下c盘里面的驱动代码又不是Linux用的,于是对照IP的文档在Linux上写了个程序:简单的轮询。可以用了,更好点的是中断了,以后再说吧,下面是程序。
main.c
#include
#include
#include
#include
#include
#include
#include "hwlib.h"
#include "soc_cv_av/socal/socal.h"
#include "soc_cv_av/socal/hps.h"
#include "soc_cv_av/socal/alt_gpio.h"
#include "hps_0.h"
#include "uart.h"
#include

#define HW_REGS_BASE ( ALT_STM_OFST )
#define HW_REGS_SPAN ( 0x04000000 )
#define HW_REGS_MASK ( HW_REGS_SPAN - 1 )

volatile unsigned long *h2p_lw_uart_addr=NULL;


int main(int argc, char **argv)
{
        void *virtual_base;
        int fd;
        unsigned char indata;
       
        // map the address space for the LED registers into user space so we can interact with them.
        // we'll actually map in the entire CSR span of the HPS since we want to access various registers within that span
        if( ( fd = open( "/dev/mem", ( O_RDWR | O_SYNC ) ) ) == -1 ) {
                printf( "ERROR: could not open \"/dev/mem\"...\n" );
                return( 1 );
        }
        virtual_base = mmap( NULL, HW_REGS_SPAN, ( PROT_READ | PROT_WRITE ), MAP_SHARED, fd, HW_REGS_BASE );       
        if( virtual_base == MAP_FAILED ) {
                printf( "ERROR: mmap() failed...\n" );
                close( fd );
                return(1);
        }
        h2p_lw_uart_addr=virtual_base + ( ( unsigned long  )( ALT_LWFPGASLVS_OFST + UART_BASE ) & ( unsigned long)( HW_REGS_MASK ) );

        uart_init(0);
        while(1)
        {
                printf("reading.... \r\n");
                indata = read_uart();
                printf("data=%02X \r\n",indata);
                write_uart(indata);
                if(indata=='q')
                        break;
        }
       
        if( munmap( virtual_base, HW_REGS_SPAN ) != 0 ) {
                printf( "ERROR: munmap() failed...\n" );
                close( fd );
                return( 1 );

        }
        close( fd );
        return 0;
}


uart.c

#include
#include
#include
#include
#include "hwlib.h"
#include "uart.h"
#include "hwlib.h"
#include "soc_cv_av/socal/socal.h"
#include "soc_cv_av/socal/hps.h"
#include "soc_cv_av/socal/alt_gpio.h"

/***********************************************************
DATA REGIST:
8. . . 0 DATA R/W The value to transfer to/from the RS232
        UART Core. When writing, the DATA field
        is a character to be written to the write FIFO.
        When reading, the DATA field is a character
        read from the read FIFO.
9 PE R Indicates whether the DATA field had a parity
        error.
15 RVALID R Indicates whether the DATA and PE fields
        contain valid data.
23. . . 16 RAVAIL R The number of characters remaining in the
        read FIFO (including this read).

CONTROL REGIST
0 RE R/W Interrupt-enable bit for read interrupts
1 WE R/W Interrupt-enable bit for write interrupts
8 RI R Indicates that the read interrupt is pending
9 WI R Indicates that the write interrupt is pending
23. . . 16 WSPACE R The number of spaces available in the write
        IFO.


****************************************************************/
#define RVALID 15


extern volatile unsigned long *h2p_lw_uart_addr;

void uart_init(unsigned int Mask)
{
        alt_write_word(&h2p_lw_uart_addr[UART_CONTROL_REG], Mask );
}

unsigned char read_uart()
{
        uint32_t uidata;
        unsigned char ret;
       
        while(1){
                uidata = h2p_lw_uart_addr[UART_DATA_REG];
                if(uidata &( 1<                         ret = uidata&0xff;
                        return ret;
                }
                usleep(10);
        }
}

void write_uart(unsigned char data)
{
        uint32_t uidata;
       
        uidata = data;
        alt_write_word(&h2p_lw_uart_addr[UART_DATA_REG], uidata );
}

uart.h


#ifndef UART_H_
#define UART_H_

#define UART_DATA_REG 0
#define UART_CONTROL_REG 1

void uart_init(unsigned int Mask);
unsigned char read_uart();
void write_uart(unsigned char data);


#endif /*UART_H_*/


还有个fpga的图片。
表达能力较差,再加上本来就是菜鸟,不要笑话我。

QQ截图20161101185325.bmp (3.79 MB, 下载次数: 21)

QQ截图20161101185325.bmp
此帖出自FPGA/CPLD论坛

最新回复

请教一下楼主,你在qsys里面添加的串口,对应到在hps里怎么触发中断呢?对应到hps那里中断地址是多少呢?  详情 回复 发表于 2016-12-4 22:15

赞赏

1

查看全部赞赏

点赞 关注
 

回复
举报

6423

帖子

17

TA的资源

版主

沙发
 
给楼主点赞,多谢楼主分享
此帖出自FPGA/CPLD论坛
个人签名training
 
 

回复

5979

帖子

8

TA的资源

版主

板凳
 
非常好!继续加油
此帖出自FPGA/CPLD论坛
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 
 

回复

9

帖子

0

TA的资源

一粒金砂(中级)

4
 
谢谢鼓励,虽然比较简单的问题,但是我们新做的不知道,对了很久发现qsys里面自带的那个IP,uart不是Linux驱动下面的那个。不知道Linux下面的那个驱动应该有另外的IP包。准备做个数据采集仪,这两天在想办法找人给我画板子。
此帖出自FPGA/CPLD论坛
 
 
 

回复

15

帖子

0

TA的资源

一粒金砂(中级)

5
 
请教一下楼主,你在qsys里面添加的串口,对应到在hps里怎么触发中断呢?对应到hps那里中断地址是多少呢?
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表