138 Upp问题咨询 - OMAP-L138 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站
点击跳转“创龙科技服务通”

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 1 w8 |/ ?1 o+ L1 [8 J

* |: z1 x8 {; e问题描述:
6 i9 O+ u/ f1 i& Z1 Y4 a8 U在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
% U( ?2 D: b- l* s/ [% ]$ u0 C. X/ n4 k7 A' Y) N9 @
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。; G* N/ {! Y5 o/ o& o
4 z. Y4 D) z- Y
测试结果如下:
2 l! n/ @3 @1 S9 f& f138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?- z' v' n, z) s5 M/ n  a
$ `0 d2 ^. W8 _. U" ~" j

+ W, c. d5 I5 H/ H6 }  L- P7 B% a备注:
1 K& [0 H+ Y2 Q1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?" p* ?, X, U3 G6 K. T
2、相关代码如下:: E& G7 m3 Q7 Z' |1 D/ b
//UPP DMA缓冲大小512字节
6 M% V4 L: n  M9 u* P- q#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
# C5 D& f, V# a1 j#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
! h: D' |" |9 b2 I#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
/ t" e/ Z, L% n# U3 k1 s: k- h' y! L1 _) L9 O+ _+ {% f

+ W* x; m% E; ^//upp接收、发送buffer
8 w, S& H+ S) _$ g1 E6 N5 D$ t#pragma DATA_ALIGN(upp_buffer_a, 8), R  A0 m9 q# y2 P2 C5 H5 {! \* h5 ^
#pragma DATA_ALIGN(upp_buffer_b, 8)
. M# ]8 j7 [8 c! `; b
( q- G1 M$ V; Z& T' }7 A% h% Cunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];1 A+ A5 y6 D0 W. y6 M
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];( C" r, q& @- n/ t7 }7 Y4 v
/ ~' L. x4 h6 @: p5 `
, H# N' q1 g# [* ?
static bool server_upp_data_recv(Server *server)
4 J8 N- o2 D  C2 j, w" N+ `2 [{& j3 S; a5 o( ~7 J& e
    if(server->upp_channel_a_recv == false) {
( _# F' @8 U) [3 U9 }/ G( r        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
( W4 t- Y! d# }( O( H  Z        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
  D. g9 [, j2 n            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
5 y: r6 w8 y- b* c0 ?* ^& C7 f
5 g. h. ^2 ]2 F# j4 P
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
+ ]' I. i3 |1 o1 q' ~( q* C5 [
+ T0 g) ~7 B! q+ E            server->upp_channel_a_recv = true;//
4 U2 j; Y% X# P# ^            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
' d5 c7 _; y( S            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
- K# e4 S& X' h$ n# B            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;9 y$ n( L+ [9 h6 Q. ~
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
) u* ?( F; }' W' R' J8 L# N3 b$ d8 u* j
            upp_error_count = 0;6 J- s6 M" m# Z- ?; y
            upp_dmai_int_cut = 0;
4 [  X6 \! X, c& k6 x( `9 M$ y* a4 H, j
            // fill in data 8 R6 r1 K+ g6 f9 y4 V$ h
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);" Q8 X( i6 l% t5 z% q
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");# T. A6 e* j: h" M& i9 n- j6 q
        }
' f) q3 k) K& F1 u. X" S' ~& r    }
$ ]+ C2 ~- _; v/ J    else{5 \' H0 L. H, L% ?
        if (upp_dmai_int_cut > 0){
6 H; A; y  d' W: Z: i5 B            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);6 t5 E; j# R! p$ ^2 X
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
% |$ n0 y: r9 o) b9 d' o/ n
, ?; P- w" N4 j& [! ~9 f; d) ^( b* n. F/ j; w
            //copy data to upp_recv_list_busy) ^3 Q4 T' K5 ?
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
0 X2 B+ `2 ^1 S& q, G% X
' e$ M* Z0 Z8 C+ l, c7 y            //5 Z4 H0 I4 `! C+ m* i. H" X1 K* D; h
            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
  o$ w) Y" _) ?$ d$ M5 L9 q. g9 o: O, e" h; ?  X4 q. x0 q
            //- I  h; l9 K: N' ]
            server->upp_channel_a_recv = false;//
( j; c4 c# t" Q: U; O
% U8 R1 O; ]7 X. Z5 f9 P            server_msg_send(server, APP_CMD_LOG, "upp recv: success");" F6 j" z1 B4 w2 N" `' @
        }: `% C* J! m. p& f5 k
    }) s0 _9 O; s; j. ~
# F( l  I' r% E& w' d2 P# y

7 D# w: E9 X7 [* o    return true;3 x7 H5 D" W! |+ j( e" v- d/ b# T
}7 p# T) ?9 {! t& B  @

) Z' r) m2 \8 N; B- [static bool server_upp_data_send(Server *server)
9 V: u0 p; a: m4 M  X0 m$ k8 P{
( }+ G5 i6 z3 M# F    if(ListMP_empty(server->upp_send_list_busy) == FALSE){- z  \$ g- S2 g- L
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);* S" {" t8 k# Y! o7 P+ V1 Z$ o
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
. Y% H+ r2 x. z1 ]: N! O        char tmp[128] ={0};8 W7 x' p4 s5 H  `( g* x7 j! w
0 J  a! t  _! y) P' n9 V3 C3 Y- C
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
. e; ^7 ^' y$ I+ }- x        print_log(server, data, 64);2 X8 Q7 N/ e! l, j- a
7 n1 [* N( V" K) U
        //
) Q+ Z7 M4 \: H. X  b        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
' C, ^- H0 W2 `6 X/ p        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
2 y; u$ I! B  j, m% Z        print_log(server, upp_buffer_b, 64);
' b# W: H6 g3 h! P! e
: d# x! f- v/ |# I- |9 P        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
+ O: E* x! v7 Q1 X& p        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; & N+ f$ a. G$ v; f0 T- u
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
, F1 W, j- l4 w0 I        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
$ O" k0 x$ @( g. H" n* K0 t+ [
& u' X8 w1 Z( H% F0 m: x        memset(tmp, 0, sizeof(tmp));
' I' l' o4 t& G* n- `* l        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
: U% W$ h+ j  E; D, |( Q            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);& J  L/ v4 p5 @5 B
        server_msg_send(server, APP_CMD_LOG, tmp);
0 B- W7 L% [/ J2 C9 \6 H
. }1 |& e8 _& q4 a& C        upp_error_count = 0;
+ W4 U9 v! \# l# K0 k$ Y" J        upp_dmaq_int_cut = 0;- p' H% g  c8 O  p! K+ X5 j, P
        // fill in data
. @: M0 u2 J0 u* ^7 J5 a7 ~4 C! K0 N        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); * [# Y, |  R, F/ E
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
3 Z# q0 m2 t7 W& ?" b5 @' |2 E6 @+ v% e0 e$ C7 b% w
        // wait send success. S0 z3 a; A* J
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); ' ^4 H6 q. G: \, v- k

7 ]3 t' U' G7 ~# u        // make data node in free list
2 W$ k8 v9 m: W0 Z) Y        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);# P0 G; ?# w. j0 Z, S
        server_msg_send(server, APP_CMD_LOG, "upp send: success");0 |! n4 p7 m; v- K5 w3 r5 b. f
    }
9 D  ^) v7 u% K! S. j+ k    return true;
3 K& |6 K- l( H* |% c6 O" y3 Y% M: Z9 T) l}3 b3 U4 ~$ M- ^$ J: |( s! z9 m) p

, [, w* k/ {* Q/ b- R. F

3 I: U( l, q- V8 Z2 _
! n2 ~5 S. e2 x. z1 f: y

; a* J0 x1 s4 J
% o: S4 z) |1 f2 n

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐7 B$ D7 b+ h9 L1 s  B0 X  ~- z

7 m7 u: R0 W! C8 y2 m5 d

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

点击跳转“创龙科技服务通”

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

GMT+8, 2026-4-8 02:54 , Processed in 0.040802 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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