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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
' n- }* ]4 y: T: Z. W/ S  M/ P3 A/ v2 A% {
问题描述:  V2 q! L; q) A$ T3 R
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:( N+ K# X' y) B% @! @
6 u9 ]& G1 _  b9 j$ R2 ~* P
图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
8 H! z! ^2 e6 L) ], s* M) U2 L4 c. o: X. O- Q
测试结果如下:5 ]& u5 {- b9 w( s# O3 v
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?
- e  [3 W  t5 F- l/ L; l8 }1 S! s8 ^9 w6 u8 m" D, V. m4 p
: u% B- ?. p4 Y' T$ u
备注:. p8 b2 S0 k. ~& I
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
* X8 Y/ ^8 W2 o0 ^6 U' Z& E1 t
2、相关代码如下:
$ z! o% T* @5 X; G- w5 U: ]//UPP DMA缓冲大小512字节: w, W) b0 W# y% I3 _/ |$ h
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍  r$ c5 C! F$ ^1 F* J
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
. @. @. t3 v- ~, y0 R" Z& l#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
- [. Y1 t! o4 g- n
" A3 Y/ M8 V1 J: Z! G0 a/ Q& B- H6 j3 h. e- q2 B7 D
//upp接收、发送buffer
( h. }- {  t7 C3 C2 m7 K& f/ X#pragma DATA_ALIGN(upp_buffer_a, 8)
4 f$ @' t# V! J1 |; f$ L#pragma DATA_ALIGN(upp_buffer_b, 8)
' P9 T! o* _: J& Y
. t7 P4 }2 [  x, i/ l7 `unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
4 E. D: Z5 X& i2 g. Q0 [. w8 Ounsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];; o/ S7 U* r1 j$ B4 F6 D+ Y

- j  i9 d3 t" S
  @/ F9 [/ E! j# v2 bstatic bool server_upp_data_recv(Server *server) 4 q/ B  A' ~6 p+ |
{
* z+ n4 }, u4 u* r' k) }    if(server->upp_channel_a_recv == false) {* _+ d0 n  S6 c5 u" {
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
3 S8 n1 H7 P0 v5 b2 D: D        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
# h0 F. |/ M8 s( j            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
4 w/ F8 x) V0 u% u& x$ o6 {7 g& E$ K. d3 u+ F

( \2 Q' e* h( _2 v2 |- o* B            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
* D4 S* C& O0 d* o$ U2 ]
  X# ~. V4 }  J& h9 ~" e            server->upp_channel_a_recv = true;//0 e6 S: k* g& M
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
( k& u1 _* w1 H$ _  g# {3 J            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
- d# y4 `, W# c3 z5 A% b            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
# H; n0 W, ^! v! |            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//5 E$ [% G! M& M5 c2 K, f, \

2 U) Y. Q* Z- W            upp_error_count = 0;
2 i/ d+ u8 w0 ^- k            upp_dmai_int_cut = 0;( W4 |+ M& ?$ o& D) M
5 z' R+ \1 S5 q/ h
            // fill in data
# _* o5 I* f1 L8 f% B% `6 @            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);. B" o: ?( I9 }
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
( H  j: ~6 F& A" _5 c        }
$ l4 z/ P& I8 [* S    }
( i3 d# X- h8 K5 F2 m: W, o% v6 V0 A4 u    else{
) E4 i7 E8 C- ~/ O6 d! E+ [        if (upp_dmai_int_cut > 0){
! Q1 [, [" h' ?" ^            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);9 y  A* b0 {- Z" |, @9 h- }/ P
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
: B" V+ ?# M' S4 ~3 @; O  k) A+ [( Z4 t- J- S

, n+ {/ I& T5 ?" v+ u" H( L8 K            //copy data to upp_recv_list_busy4 q: f3 i3 j. W3 ^* j( B5 v
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);3 w, P6 H% Y* I+ R$ C
5 ?% [! a# \5 l, q$ I
            //
5 s  x3 E% S" m) c, W( ^            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
* x5 q0 u! \' k6 {. c8 R% @" n
8 B' N8 i# Y0 q" Q8 `7 c" _8 U            //2 Q0 w4 c6 j' M, I' o+ N* @
            server->upp_channel_a_recv = false;//2 x7 W1 c% S3 \& d6 a5 R  a# x$ g
' ?( \3 b9 f3 C/ |7 `1 @
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
& q0 Z" b' U) x        }
7 L0 R2 Q( O  e: j    }: E- B& y8 l3 B- C. S1 B# m2 {
; g, ?7 Q. q+ P5 l7 ]' U
. C0 K+ s; \2 N3 _3 X9 V0 h
    return true;
6 g: \# L+ N( ?' ^3 J/ g3 U}
. y8 e, D# G* k- b2 t
: W- D0 @) b& E( g2 K/ H& {static bool server_upp_data_send(Server *server); [2 j+ J: E) Z8 x, s, `& D
{! j- ?( m7 v7 l  ~% p4 I9 K
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){' u+ y; q3 M3 L, V$ U
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);! [" H$ |5 g( K2 c0 q5 l& f
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);3 v# h* u1 i, O  C# Q3 Q
        char tmp[128] ={0};+ G& U; I- H6 n4 q, i
0 t3 r7 n# _; r8 g+ ?! J
        server_msg_send(server, APP_CMD_LOG, "upp send: start");) |( w7 m3 I" [  u- L
        print_log(server, data, 64);" s  ]# f) @+ n) }' K- p' }
5 G" `2 B. j! j9 E% U
        //2 i( X0 j3 ^  S( N+ B7 h
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);& E0 [: V/ j% P7 a8 Z
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
! Q# _6 F+ |3 @0 E" \3 }: ~        print_log(server, upp_buffer_b, 64);( c' ~# t  B8 c! x/ `$ l7 b
# ]) w/ }5 o# g- X2 Y# L! E9 Q
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);# y. }' w) o7 C+ m
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
8 I  p5 J8 D& C. H! s        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;1 |$ Y% d7 f9 J& x; r% ^: _! \
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;, l: a$ f) R' S( w% a- H  ~3 a+ P

6 G. J. k& e% Q. t        memset(tmp, 0, sizeof(tmp));2 U, d; ^: \) r1 S8 W& p
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
6 T1 n6 r- x# ?( o            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
! P+ Y- P! E- w' Y' f6 {8 K+ Y# v        server_msg_send(server, APP_CMD_LOG, tmp);
* ~# j1 v6 i6 S0 P) F# ~  z; h6 Y  c% E# c
        upp_error_count = 0;
- o" J& X! A1 D& e3 Q        upp_dmaq_int_cut = 0;6 W8 q1 g- }8 I" @
        // fill in data
2 e* U; d# R2 o! T6 K/ f/ M" _+ a- A        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); ! Z" Z/ v  h1 Q! d- f. D
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");5 j; W& \& j0 r+ H8 l& @& D
9 g# g  t6 s" \0 F
        // wait send success, `0 ~/ |, U! B- q4 {3 j1 D
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
! U; f2 |% e" I' @( K2 j' V
3 F. s. k4 D( b! s: I3 G' u        // make data node in free list : ~' l3 Q8 u4 }( g: E( R
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);3 p9 f5 G. W  c1 G9 z# A; ^- F6 j
        server_msg_send(server, APP_CMD_LOG, "upp send: success");: A1 I1 I" k1 B6 {' x2 m% r4 E; Z
    }+ l7 H. N  j) X0 o" X7 v
    return true;2 z) a3 N$ b/ c; L8 H
}
+ t9 I3 b' T3 c5 @( c8 `/ R  J- Q

- i/ T& y! U3 X, Q9 z4 _" A7 ~* ~, ^/ r* q

* r- w" a% E) u9 ]! B8 I; ~" G# H$ T

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐) u, r/ z& m3 A9 a* j
. o$ H- ~, P2 C$ @

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-3 07:32 , Processed in 0.041895 second(s), 26 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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