【无标题】vxworks ARM Pl330DMA 数据传输指令流创建

2023-11-03

 

/*******************************************************************************
*
* pl330DmaChanMicroCodeCreate - create micro code for dma transfer
*
* This routine create micro code for dma transfer
*
* RETURNS: OK or ERROR if there is an error.
*
* ERRNO: N/A
*/
LOCAL STATUS pl330DmaChanMicroCodeCreate
    (
    VXB_DEVICE_ID       pDev,
    PL330_DMA_CHAN *    pChan
    )
    {
    UINT32                  chan;
    UINT32                  ccr;
    UINT32                  loop0;
    UINT32                  loop1;
    UINT32                  rest;
    UINT8 *                 pBuf;
    UINT32                  loop0Start;
    UINT32                  loop1Start;
    UINT32                  burstSize;
    PL330_DMA_CHAN_PARAM *  pChanParam;

    chan        = pChan->chanNum;
    pChanParam  = pChan->pChanParam;
    pBuf        = pChan->pMicroCodeBuf;
    bzero ((char *)pChan->pMicroCodeBuf, PL330_MICROCODE_SIZE);

    /* switch to 1 byte mode if address not align with burst size */

    if ((pChanParam->srcBurstSize == 1) ||
        (!ALIGNED (pChanParam->srcAddr, pChanParam->srcBurstSize)) ||
        (!ALIGNED (pChanParam->dstAddr, pChanParam->srcBurstSize)))
        {
        burstSize = CCR_BURST_SIZE_1;
        pChanParam->srcBurstSize = 1;
        }
    else if (pChanParam->srcBurstSize == 2)
        {
        burstSize = CCR_BURST_SIZE_2;
        }
    else if (pChanParam->srcBurstSize == 4)
        {
        burstSize = CCR_BURST_SIZE_4;
        }
    else if (pChanParam->srcBurstSize == 8)
        {
        burstSize = CCR_BURST_SIZE_8;
        }
    else if (pChanParam->srcBurstSize == 16)
        {
        burstSize = CCR_BURST_SIZE_16;
        }
    else
        {
        return ERROR;
        }

    ccr = (pChanParam->endianSwapSize |
           CCR_DST_CACHE_CTRL |
           CCR_SRC_CACHE_CTRL |
           CCR_DST_PROT_CTRL |
           CCR_SRC_PROT_CTRL |
           pChanParam->dstInc |
           pChanParam->srcInc |
           CCR_DST_BURST_LEN |
           CCR_SRC_BURST_LEN |
           (burstSize << 15) |
           (burstSize << 1));

    DMAMOV (pBuf, CCR, ccr);                    /* DMAMOV CCR, ccr */
    DMAMOV (pBuf, SAR, pChanParam->srcAddr);    /* DMAMOV SAR, src */
    DMAMOV (pBuf, DAR, pChanParam->dstAddr);    /* DMAMOV DAR, dst */

    loop0 = pChanParam->transferSize / pChanParam->srcBurstSize;

    if (loop0 > MAXLOOP)
        {
        PL330_DMA_DBG_MSG (10, "Too big size! 0x%x\r\n", pChanParam->srcAddr,
                           1, 2, 3, 4, 5);
        return ERROR;
        }
    else
        {
        loop1 = loop0 / 256;
        }

    rest =  pChanParam->transferSize % pChanParam->srcBurstSize;

    if (loop1 > 0)
        {
        DMALP (pBuf, 1, loop1);             /* DMALP loop1 */
        loop1Start = (UINT32)pBuf;
        DMALP (pBuf, 0, 256);               /* DMALP loop0 */
        loop0Start = (UINT32)pBuf;
        if (pChanParam->tansferType != MEM_TO_MEM)
            {
            DMAWFP (pBuf, pChanParam->peripheral);
            }
        DMALD (pBuf);                       /* DMALD */
        DMARMB (pBuf);                      /* DMARMB */
        DMAST (pBuf);                       /* DMAST */
        DMAWMB (pBuf);                      /* DMAWMB */
        DMALPEND (pBuf, 0, loop0Start);     /* DMALPEND loop0 */
        DMALPEND (pBuf, 1, loop1Start);     /* DMALPEND loop1 */
        }

    loop0 = loop0 % 256;
    if (loop0 > 0)
        {
        DMALP (pBuf, 0, loop0);             /* DMALP loop0 */
        loop0Start = (UINT32)pBuf;
        if (pChanParam->tansferType != MEM_TO_MEM)
            {
            DMAWFP (pBuf, pChanParam->peripheral);
            }
        DMALD (pBuf);                       /* DMALD */
        DMARMB (pBuf);                      /* DMARMB */
        DMAST (pBuf);                       /* DMAST */
        DMAWMB (pBuf);                      /* DMAWMB */
        DMALPEND (pBuf, 0, loop0Start);     /* DMALPEND */
        }

    if (rest > 0)
        {
        /* switch to 1 byte mode if transfer size not align with burst size */

        ccr = (pChanParam->endianSwapSize |
               CCR_DST_CACHE_CTRL |
               CCR_SRC_CACHE_CTRL |
               CCR_DST_PROT_CTRL |
               CCR_SRC_PROT_CTRL |
               pChanParam->dstInc |
               pChanParam->srcInc |
               CCR_DST_BURST_LEN |
               CCR_SRC_BURST_LEN |
               (CCR_BURST_SIZE_1 << 15) |
               (CCR_BURST_SIZE_1 << 1));

        DMAMOV (pBuf, CCR, ccr);            /* DMAMOV CCR ccr */
        DMALP (pBuf, 0, rest);              /* DMALP loop0 */
        loop0Start = (UINT32)pBuf;
        if (pChanParam->tansferType != MEM_TO_MEM)
            {
            DMAWFP (pBuf, pChanParam->peripheral);
            }
        DMALD (pBuf);                       /* DMALD */
        DMARMB (pBuf);                      /* DMARMB */
        DMAST (pBuf);                       /* DMAST */
        DMAWMB (pBuf);                      /* DMAWMB */
        DMALPEND (pBuf, 0, loop0Start);     /* DMALPEND */
        }

    DMASEV (pBuf, chan);                    /* DMASEV */
    DMAEND (pBuf);                          /* DMAEND */

    return OK;
    }

                
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【无标题】vxworks ARM Pl330DMA 数据传输指令流创建 的相关文章

  • Verilog:【1】时钟分频电路(clk_divider.sv)

    碎碎念 作为Basic Verilog的第一个学习笔记 打算用这种命名方式来对博客进行命名 应该有助于检索 简单阅览了部分工程的代码 发现里面有很多嵌套关系 因此决定先从基础模块开始 也是为了整个博客内容的流畅性 读者朋友有问题的话 也可以
  • Verilog的奇技淫巧[更新中]

    1 Verilog常用的数据选择语句vect a b 或vect a b 转载自 MDY常用的数据选择语句Verilog明德扬论坛 Powered by Discuz vect为变量名字 a为起始位置 加号或者减号代表着升序或者降序 b是进
  • 平头哥(T-Head )开源RISCV处理器OpenC906 RTL仿真

    在过去的几年里 阿里集团平头哥陆续推出了几款RISCV处理器 有些处理器已经在产业界得到了应用 比如在某志的D1处理器中 就嵌入了平头哥的玄铁C906内核为 芯 RISCV虽然是一个开放标准 并且网络上也不乏一些开源核的RTL实现 但是商用
  • MIPI D-PHY介绍(二) FPGA

    MIPI D PHY介绍 二 FPGA 随着移动设备的广泛普及 MIPI D PHY作为其最主要的物理层标准之一 被越来越多地使用在各种嵌入式系统中 本文将详细介绍MIPI D PHY的工作原理和在FPGA设计中的实现方法 MIPI D P
  • PLL时钟约束

    方法 1 自动创建基时钟和 PLL 输出时钟 例 derive pll clocks 这一方法使您能够自动地约束 PLL 的输入和输出时钟 ALTPLL megafunction 中指定的 所有 PLL 参数都用于约束 PLL 的输入和输出
  • J-Link仿真器与JTAG和SWD下载与接线

    目录 1 JTAG 1 1JTAG今天被用来主要的三大功能 1 2JTAG引脚 1 3可选引脚 2 SWD 2 1 SWD引脚 2 2 可选择引脚 2 3 JTag和SWD模式引脚定义 3 J Link仿真器 4 IAR与MDK配置两种下载
  • SD卡读写实验(SPI模式)

    对于 SD 卡的 SPI 模式而言 采用的 SPI 的通信模式为模式 3 即 CPOL 1 CPHA 1 在 SD 卡 2 0 版 本协议中 SPI CLK 时钟频率可达 50Mhz SD 卡的 SPI 模式 只用到了 SDIO D3 SP
  • 【Xilinx DDR3 MIG】Xilinx FPGA DDR3读写实验相关用户接口引脚解释

    目录 DDR3读写实验 实验框图 时钟模块 DDR3读写及LED指示模块 MIG IP核 用户接口解释
  • IC数字后端

    在 innovus 里面 有时候我们需要控制 tie cell 的 fanout 和 net length 来避免 tie cell 可能出现 max transition 或者 max fanout 的违例 一般来说 只要 fanout
  • 【DDR3 控制器设计】(3)DDR3 的写操作设计

    写在前面 本系列为 DDR3 控制器设计总结 此系列包含 DDR3 控制器相关设计 认识 MIG 初始化 读写操作 FIFO 接口等 通过此系列的学习可以加深对 DDR3 读写时序的理解以及 FIFO 接口设计等 附上汇总博客直达链接 DD
  • [HDLBits] Exams/ece241 2014 q7a

    Design a 1 12 counter with the following inputs and outputs Reset Synchronous active high reset that forces the counter
  • PAJ7620U2手势识别——配置0x00寄存器(3)

    文章目录 前言 一 为啥要配置0x00寄存器 二 配置步骤 1 单个读操作步骤图 2 模块状态转移图绘制 3 模块波形图绘制 4 上板验证 5 参考代码 总结 前言 在前面的教程中 小编带领各位读者学习了如何通过I2C协议去唤醒PAJ762
  • 【电子技术】什么是LFSR?

    目录 0 前言 1 数学基础 1 1 逻辑异或 1 2 模2乘法 和 模2除法 2 线性反馈移位寄存器LFSR 3 抽头和特征多项式 4 阶线性反馈移位寄存器实例 0 前言 线性反馈移位寄存器 Linear Feedback Shift R
  • 将 DKM 项目链接到内核映像 (VIP) 项目作为 VxWorks Workbench4 中的子项目/额外模块

    如何将 DKM 项目与内核映像 VIP 项目链接 加载 以便我可以从内核映像项目的 usrAppInit c 调用 DKM 项目 应用程序 的入口点函数 以在启动时自动启动应用程序 有人可以描述步骤或向我指出任何文档吗 将 DKM 项目添加
  • 无线网络管理系统与无线路由器的区别

    第5章 波形发生器软件设计 本章我们将介绍系统的软件设计 系统中控制软件占有很重要的地位 它不仅要产生波形数据 控制波形的发生 还要控制显示电路和键盘电路 因此系统软件的好坏直接决定着系统的功能和稳定 5 1软件的总体结构 在本系统中 由于
  • 基于FPGA的简易BPSK和QPSK

    1 框图 2 顶层 3 m generator M序列的生成 输出速率为500Kbps 4 S2P是串并转换模块 将1bit的m序列转换到50M时钟下的2bit M序列数据 就有4个象限 5 my pll是生成256M的时钟作为载波 因为s
  • vxworks 中的 C++ 11

    我是VxWorks的新手 我正在VxWorks平台上使用C 开发一个软件 我想知道VxWorks编译器是否支持C 11标准 我问这个问题的原因是因为没有可用的shrink to fit std vector 函数 该函数是在c 11 标准中
  • Matlab图像处理系列——图像复原之噪声模型仿真

    微信公众号上线 搜索公众号 小灰灰的FPGA 关注可获取相关源码 定期更新有关FPGA的项目以及开源项目源码 包括但不限于各类检测芯片驱动 低速接口驱动 高速接口驱动 数据信号处理 图像处理以及AXI总线等 本节目录 一 图像复原的模型 二
  • Vivado ILA的debug信息保存与读取

    保存 write hw ila data D Project FPGA ILA Debug Data 202401041115 ila upload hw ila data hw ila 1 读取 display hw ila data r
  • 如何将 ifconfig 命令的输出保存到缓冲区中?

    我必须使用 C 和 VxWorks 将命令 ifconfig 的输出保存到字符缓冲区中 我该怎么做 ifconfig 是一个 shell 命令 因此您应该能够使用 gt 将其输出重定向到文件 然后读取该文件 您还可以查看手册中的 重定向 S

随机推荐

  • 51单片机控制数码管显示以及控制打断

    实践内容 1 利用单片机的P0口接数码管的字段脚 P1 0脚接共阴极 P3 2 P3 3引脚接独立按键产生外部中断信号 编写程序 当程序正常运行时数码管显示H字符 当外部中断0有中断请求信号时 数码管从0 9循环显示一次后回到正常状态 如果
  • ARP攻击后续

    查看ARP缓存表 我们先了解一下ARP缓存表的概念 络设备一般都有一个ARP缓存 ARP Cache ARP缓存用来存放IP地址和MAC地址的关联信息 在发送数据前 设备会先查找ARP缓存表 如果缓存表中存在对方设备的MAC地址 则直接采用
  • VS2013编译FFMPEG遇到的坑

    因为需要 用到老的FFMPEG库 但官方又没有编译好的LIB和DLL 只能下载源码自己编译了 但对LINUX环境不懂 只有在WINDOWS上配置环境编译 记录过程如下 1 下载FFMPEG源码 下载地址 http ffmpeg zerano
  • RV32I指令集

    RV32I是最基本的32位Base指令集 它支持32位寻址空间 支持字节地址访问 仅支持小端格式 little endian 高地址高位 低地址地位 寄存器也是32位整数寄存器 RV32I指令集的目的是尽量简化硬件的实施设计 所以它只有47
  • 蓝奏云访问修复(JavaScript 几个参数及命令讲解)

    每次都要更改蓝奏云分享链接中的 www lanzous com 为 ww lanzous com 麻烦 改 Hosts 有效果 但写个脚本不香么 蓝奏云访问 用到的命令和参数 window location href 当前页面的 URL 字
  • 解决粘包问题的三种方法

    方法一 定长数据流 服务器客户端提前协商 每个消息定长 不足的空白字符补足 方法二 特殊结束符 双方协商定义一个特殊的分隔符号 比如 等 只要没有发送分隔符就意味着一条数据没有结束 方法三 协议 相对最成熟额数据传递方式 由服务器开发者提供
  • http常见字段

    Host字段 客户端发送请求时 用来指定服务器域名 有了Host字段 就可以将请求发往同一台服务器上的不同网站 Content Length 字段 服务器在返回数据时 会有Content Length字段 表名本次回应的数据长度 Conne
  • Vue 团队公开快如闪电的全新脚手架工具,未来将替代 Vue-CLI,才300余行代码,学它!...

    1 前言 大家好 我是若川 欢迎关注我的公众号若川视野源码共读活动ruochuan12 想学源码 极力推荐之前我写的 学习源码整体架构系列 jQuery underscore lodash vuex sentry axios redux k
  • 求生之路2 局域网联机教程

    1 下载游侠网的 求生之路2 生存之旅2 V2 1 2 1中文绿色免安装公网联机版 2 双方保持版本号一致 3 版本号在E Left 4 Dead 2 left4dead2 steam inf里 4 对主程序建立快捷方式 5 在快捷方式的属
  • 文件服务器磁盘增量备份,完全备份、差异备份以及增量备份

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 常用的数据备份方式有完全备份 差异备份以及增量备份 那么这三种备份方式有什么区别 在具体应用中又该如何选择呢 1 备份方式简介 完全备份 Full Backup 备份全部选中的文件夹 并不依赖文
  • JS alert() 弹出框乱码的问题

    今天写了一个html 中间引用了js文件 chrome显示和html的字符集都是utf 8 但执行事件onclick alert 请输入数字 弹出乱码 百度一下 找到了解决方法 好了 废话不说了 1 在html中 引入js 插入的语句中指定
  • Mysql 启动报错解析:Starting MySQL.. ERROR! The server quit without updating PID file (/usr/local/mysql/dat

    问题 root centos74 service mysqld start Starting MySQL ERROR The server quit without updating PID file usr local mysql dat
  • 【Obsidian样式】修改文件夹名称和文件名称前的图标

    声明 本文大部分内容来自于https www bilibili com read cv17822164 方法一 Obsidian Icon Folder插件 Github https github com FlorianWoelki obs
  • 中断管理基础学习笔记 - 6. 软中断

    目录 1 前言 2 软中断概述 软中断类型 软中断数据结构 3 注册软中断 4 触发软中断 raise softirq raise softirq irqoff 5 执行软中断 中断返回 ksoftirqd local bh enable
  • 在windows环境下使用wget

    众所周知呢wget这个工具是Linux Unix下才能使用的 但是本人公司的电脑上没有这两个系统 产品经理又硬性要求 所以查百度 问朋友终于搞定了 wget在windows的环境下使用原来以前都有前辈做到了 这里是自己做下笔记 以方便自己以
  • telbot负载均衡设置

    telbot负载均衡设置 概述 golang 横向扩展电报机器人 采用webhook方式 nginx做负载均衡 这样就可以分担请求 减小单个服务器的负担 配置方式 负载端 package main import tele gopkg in
  • idea eclipse 快捷键全局搜索替换代码 修改包名

    全局搜索替换 选中项目右击 点击Replace in files 在文件中替换 输入查找 替换的内容 replaceAll 替换所有 全局搜索查找代码Ctrl H File mask 选择文件类型 可以更精确查找 文件查找Ctrl Shif
  • STM32+LZMA的移植经历

    连续一天加一个晚上 查资料 发现无解 压缩不可能在STM32上进行的 因为代码中那个内存分配的结构体占内存太大了 解压是可以实现的 因此这个算法在STM32上也是有一些作用 在某些场合可以在PC机进行压缩存入ARM中 然后ARM解压 比如某
  • Sql Server判断数据库、表、存储过程、函数是否存在

    判断数据库是否存在 if exists select from sys databases where name 数据库名 drop database 数据库名 判断表是否存在 if exists select from sysobject
  • 【无标题】vxworks ARM Pl330DMA 数据传输指令流创建

    pl330DmaChanMicroCodeCreate create micro code for dma transfer This routine create micro code for dma transfer RETURNS O