138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 6216|回复: 1
打印 上一主题 下一主题

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 # ^2 ]) }2 [6 S8 t0 L$ R
/ {0 I0 s  U1 K
问题描述:
! V$ B# Q( E* J% Q, U$ |* l在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
' J" L- s" t3 h0 V
& t! f9 W( ^, I) b0 Z  }图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
! ]3 n7 |" s- ^3 K& g# K$ a8 {5 a* K  K6 @. p' r
测试结果如下:# p; u5 ?' K' ?& |/ Q4 h
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
2 g# D5 u3 h. B$ v
$ f3 s' R/ e, X, i& {. y7 s7 E+ R. F2 S# {. K/ ^
备注:* U6 g; V' R9 S  Y, t4 |( E
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?1 |, j7 N7 G( r5 ^% A: M5 t4 h( @
2、相关代码如下:
9 f) c$ l3 v4 T# `' Q7 D8 |//UPP DMA缓冲大小512字节$ m+ E/ m5 r% K: n' c% w
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍1 ]. q& ?0 ]3 ~7 O, q, |
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
9 h* I" m2 Z/ F#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
" }8 ?! M8 ~' c
1 R/ V" r1 X/ k! J
0 y& U5 V, w+ c  E, E& P//upp接收、发送buffer
+ V( n3 U- z& b( [7 |* S$ T/ M#pragma DATA_ALIGN(upp_buffer_a, 8)
6 e% p: f" C9 a& L3 d/ r$ P#pragma DATA_ALIGN(upp_buffer_b, 8)
$ l9 V1 |7 _7 r/ m7 F, ~  Q5 s# ~8 N8 M- p  y
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 [+ D. C+ V  F* N
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];+ }2 \+ M+ `& _8 ^# Q4 F% t) _
& V+ l$ Q0 Z% q& @9 o

7 S" h5 j1 |0 M# F$ E5 jstatic bool server_upp_data_recv(Server *server)
! ?, h% C  g' q. A& ^0 `{
" ^6 Q6 M: O4 |  H5 K! }- {3 W    if(server->upp_channel_a_recv == false) {
9 }1 B0 ^1 q" Q        server_msg_send(server, APP_CMD_LOG, "upp recv: start");3 j. D2 ~, a% x% @) i0 C% O
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
5 T8 @4 \/ ^& g% D7 ^            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
0 t5 v0 z& t% k# [) O; Q1 m; {) s( S9 a! q- f0 C

; R' d- `  J- K4 `& k: w            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);4 T" W5 ^% u" I( z- K8 p5 Y
6 j; s' R, x6 C/ o' s; X" F
            server->upp_channel_a_recv = true;//1 f  ?" z4 c$ D
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
- E3 k; t# D6 z: l- f# g8 i            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
5 c* b! n9 _# A( i( |, |+ `            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;) O0 @6 P7 u, a+ Z
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//* M) _' q& G) Q, L6 l

+ u. E2 S+ F1 f9 w* N- b: c/ z8 _            upp_error_count = 0;
& M+ ?) Q! U& I+ c4 j, T            upp_dmai_int_cut = 0;" x4 p% p9 z" H: T% S+ E3 H1 h1 L
9 s9 a! U8 @6 x9 K
            // fill in data
' o1 z% K4 s, U1 z7 I3 L, @/ C4 }# @            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);' A  W3 b  [/ X, ?+ G
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
& A/ q- @% y( D- z        }. z) K1 B0 V% f% f& M3 ^
    }. T& x, q/ B. H3 T( s0 A
    else{0 w' U3 q. |6 L/ v: T
        if (upp_dmai_int_cut > 0){
! E; ?9 b( Y7 ^) M. W) B& ~            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);. _# v3 v# u5 p0 x/ G1 k/ v
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
% t4 H  l4 K: t9 }8 ]$ C0 _
( ]+ P, T! y. m; A# `; D, n/ l( ~+ g& h  {
            //copy data to upp_recv_list_busy8 L2 C! F5 b1 w
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
* u& L7 g9 ?8 e: S+ T' W' r8 Q. ]7 D3 Y6 |# I
            //
' W; B1 h/ V) u            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);5 t4 d) `- V7 D
4 B$ y/ v; ?4 a) n) B# a
            //
% E# W6 n. L% ?0 x) l/ H            server->upp_channel_a_recv = false;//
8 x% v3 M  f6 V# ?* c* H' w) {, f4 s# k3 z
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
: n. u1 e, w- p/ C, k$ R        }" L' V' I! {% r2 x# i) N! g& ~/ [
    }
* u9 f. E* W! [# a% j: Y" _/ O0 l8 r5 R+ `6 O1 R
  _6 K/ Y# ~& D% e
    return true;
+ R; J# \) E2 ^2 I}
! n6 Y' C6 {3 r# @7 y8 a) J8 D# F* \1 ~0 j1 j
static bool server_upp_data_send(Server *server)
4 n  E1 u; _, {: n5 m1 ?{
, y1 `& N: }; @9 g' M+ e    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
/ N: Q0 R: r. c* _" e        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);( C: ~1 y3 X, C
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
+ K6 x5 |, I8 K7 i3 y        char tmp[128] ={0};
9 j  Z! C$ ^5 F: K7 B  X  L/ l3 b- u- D2 Y; z
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
5 }+ q. k; ]8 E& R% ]/ n        print_log(server, data, 64);
- m: ]2 r0 _( y/ e0 s: L3 E' s% W' d4 [- q1 ^
        //
# b: L  m  j( E9 J        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
3 _! w4 ?7 O6 i( y5 A4 N+ p, K        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);( o% R+ N( B; V6 y- X6 `
        print_log(server, upp_buffer_b, 64);
. H8 P, M9 S% ~% Y! }- \: m
! P& \1 b& ?9 p        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
& W" a! j8 L" J        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 3 o( M: K- V" P" @/ s6 s
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;* b. c+ p, ~( R! h2 d
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;4 X' c/ N: y3 s9 i: h

3 e3 ^0 r/ G3 o1 n$ G        memset(tmp, 0, sizeof(tmp));
2 c( Q3 g1 u* p' j. I' D        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 9 n% g& J  p' r( C% S4 {) D+ r7 E
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
( u* p8 U# c8 i' X# O8 T7 w        server_msg_send(server, APP_CMD_LOG, tmp);
- f3 X8 s( _  Y- L) z5 w4 f: T
" G  W/ j) l: Y; `2 j0 [& O        upp_error_count = 0;
& I$ P, j" c; K        upp_dmaq_int_cut = 0;
7 p' z1 N7 c5 s' d; r        // fill in data
: b+ o2 `- T- k4 t7 Q! H+ I        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); # p  Q% |8 T1 Q  a2 h
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");# e% R0 N8 e) Z1 t

  f5 H2 |0 [3 y$ b, e        // wait send success
4 N& p+ A1 I% u; D; K        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); $ X( d4 V; [; b5 J) m- W6 i& s
! A* T* x" S: a  `9 }
        // make data node in free list ( u. L) Y/ C  D& |
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);5 t( i+ }, S- E* \7 _
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
# @! w7 y$ T/ j5 n" s    }; f4 i3 _! D& F/ [8 \
    return true;
' G* B* X7 c. I0 q}+ N# R! V+ X1 f% ^. S: D# W

8 F! g: Q6 e4 M- k6 d, a7 G. w' }( U% E6 o

' ~+ r2 E% L* F) K2 d
$ o) L0 Q* X# g! k- A( G$ F

( ~) D7 b+ {2 H5 y& O
' U6 m5 H. V4 z$ I* Q: ?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
0 r: d+ `, m& l5 U2 _/ ]8 S* `3 ]% Z, ?* D& U) ^8 M& K* I

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2025-12-1 19:15 , Processed in 0.040334 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

快速回复 返回顶部 返回列表