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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 & j6 I! L$ o3 Z- k- G

) M( B# f- Y$ s9 S# O1 A' n' H* m问题描述:
3 k/ g/ i5 G- n3 K1 r在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:( d8 @0 }. r8 t/ p7 @

! ^7 H% ~% ^7 y& c9 s图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。3 j, t+ w6 G& V6 M# [1 @% T" I

9 ~0 B! ?% e' w: q7 \测试结果如下:
6 L) D8 r0 v1 K: Q138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?1 A" h; ^7 a# a  X6 z

( n, A  O1 A7 `: c  z6 c9 p
8 U* y+ Z+ O! i) Q7 Y备注:# {$ c6 S/ X3 r  g$ H) m
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?* C9 G0 Z4 j: {7 E2 G
2、相关代码如下:& O4 Y$ U6 D9 q/ i! s1 O, y( K
//UPP DMA缓冲大小512字节7 q: x+ y1 n1 b! s; ~
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍$ c/ U" b# J% u1 I$ W
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT& N# Z, W2 _5 G, D" l8 G. v
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
- n9 S0 B: v! l* ^) d& y7 x- m; K( J# R) Y: H  r, k
3 N( I, m1 ?" `3 {2 g( j+ T; G6 T
//upp接收、发送buffer% w) L1 ~; `1 b* ?! q- P2 U( h8 @- [8 h
#pragma DATA_ALIGN(upp_buffer_a, 8)
9 o0 ^* y$ I- y. r7 q+ X6 l" a# I, x0 q#pragma DATA_ALIGN(upp_buffer_b, 8)
, r. D/ {/ k3 N1 L0 t- K7 f* s' \4 j5 v% P0 y4 ]0 {, q
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
) ^' z, r; `0 z! Y0 K  n% aunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
2 _. T* t7 S9 d. G0 T4 l0 l
  [8 t7 M0 }5 p# ~! @2 J8 Z$ [1 |2 U: z8 b" p3 B
static bool server_upp_data_recv(Server *server) 4 y/ E( n. I: O1 z: s9 Y
{
7 e1 S" r9 P, N/ P& B    if(server->upp_channel_a_recv == false) {; F* n" m; W9 v3 \) a
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");/ s8 e; h* X9 J8 D$ g; y
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {) W: o* X: |$ T8 @& b3 V, J
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
5 I. d* y  v! ?2 L1 e9 {, w: P
0 V0 c' {2 W2 V
% ]2 g5 g9 @3 h' v            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);( ]3 g( ^' g, e1 U7 w# L

* R% I! \, {3 H$ R( u  \7 M            server->upp_channel_a_recv = true;//
; _# U( V1 Q9 {; c9 r            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);1 @3 L) x9 C5 o/ |
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;( r' n5 h6 Y/ ~( U) A% K
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;. T4 \, j, i8 d4 R3 J" u* J
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ N  |4 L; R0 A
2 Y! O, J4 ]& T) N- ^. }. k6 }) f
            upp_error_count = 0;
. J3 |# O% l. |) x            upp_dmai_int_cut = 0;: x% z8 Z% h" @7 m, }
' Y: j$ h" ]7 B3 S' K5 g2 c
            // fill in data
: V* u( {7 e2 {3 ]- R' L6 `/ q9 N: `            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
3 [' S7 H# y" `% a& ?            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
5 @9 k. ~& a; z        }
5 Q& R8 ~8 H( a) G; c    }6 I( O, n5 N5 [% f
    else{% D% [" L' V9 Q8 L  n' p
        if (upp_dmai_int_cut > 0){+ S. L9 ^+ \9 I
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
% a* O! t2 e$ f' ?# s$ W* P' v% K            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
$ y1 B) ~2 ]- s+ G; H' u  K
7 j4 f8 f" P/ H) A. K: g
$ D4 R$ P- L7 d( Y; B* E) M3 x( r: A* S+ g            //copy data to upp_recv_list_busy9 @2 G( F1 v; Y/ _$ f! i6 j: K7 u
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);: k$ F% C$ B- ~% i% G) e) d
7 I% Z. u9 a! q
            //
& F: M0 |+ @2 `5 w            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);) l3 `5 m( U  y/ b/ x
; v3 `% U% ]& H/ ]! A5 u/ }
            //+ O8 C. e& K* b! W" Z0 L# g, y
            server->upp_channel_a_recv = false;//
* Q$ w' x+ C# f2 \5 d( \
$ E7 b7 D1 M( s: \            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
. s" S& B" d: u# b. @5 Z        }. y; y/ O% ~; M4 V. F  f
    }8 u; j. R  l8 v& Z; ~* W. e; ~

* t  c& e4 T, E: J. n- u! I! N
) P2 u' t& W/ a; B; k    return true;
( p8 S4 Y& i( `, u& L& _6 h4 C7 n}
7 h  X( {* l1 c, @& u! p+ ^' J; ^7 G# `' w7 V+ Y) c& M
static bool server_upp_data_send(Server *server)
5 a4 c9 r' A: P7 P* p{
* H7 g: D% j  X7 c5 o& Z' C    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: P1 b7 }% Y5 f. v7 |- a        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
  j8 R4 t% i( K( f        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
5 I( I# c6 o6 @/ p        char tmp[128] ={0};/ x3 z* _4 y; Q' n) l

& W- [# H( I  v% r: c+ m        server_msg_send(server, APP_CMD_LOG, "upp send: start");( j' Q3 B- o7 S( d/ b- \
        print_log(server, data, 64);; C4 X  {3 k, d$ b7 f" `5 V

4 o# P3 U3 W6 ?) \$ F6 J1 T. X        //
5 U) X0 a% g4 c4 n        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
. q$ l% b! J+ _        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);. b- K1 y0 H4 S, ~  N6 M) T3 B2 }
        print_log(server, upp_buffer_b, 64);
/ d; T. l; h0 E0 ?/ l4 B6 ?" s! |0 N
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
4 T1 v  V9 f+ s6 q$ Q5 Y1 n        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
: B! q$ h5 v4 x" j        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;% ~2 W7 ^- e2 T! b' r
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
6 o4 _* [' {( q) J- D) W8 F% h" H  c1 e: z7 `2 @
        memset(tmp, 0, sizeof(tmp));5 o3 w- b' `" h3 V, R4 ?& ^+ {  z
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
8 {* J: ?: H1 F  I6 T            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
  O% ~, [" k4 |! e        server_msg_send(server, APP_CMD_LOG, tmp);2 h2 I6 \8 V1 \) J2 u

# S# `4 B: E* d2 X        upp_error_count = 0;
% M. T$ u' Q4 m; x3 x0 g        upp_dmaq_int_cut = 0;9 F! d/ U2 Y5 A1 {: P6 H- L) Y/ B
        // fill in data + Q4 s, c. I! Y4 n( n8 n* |
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); 8 X% n; F) f' C. C
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");8 l  h' ]7 }& W7 n% L
; k2 K/ V) `3 l% B
        // wait send success! _& I& T7 Q* x/ }9 Q
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
$ ]) s$ J" s% N: a4 b
' \* M! B( m& i* X2 g( Y9 F        // make data node in free list
3 X% @: c6 I- X0 \, F7 P/ f) @        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
' S8 ^. ^6 [& G6 U: O2 u        server_msg_send(server, APP_CMD_LOG, "upp send: success");2 h* H+ ~8 B9 Y6 v
    }$ e1 r7 ?7 a( l) f7 q4 e. _
    return true;1 D) E3 Z- [) ]
}
4 N- E: t' r. A2 K$ A1 |9 ^
$ M5 b0 r7 v- R+ T6 d
0 W6 w6 s3 k( O5 g& C: f1 O+ y# D
& `- }$ _$ h' R% |9 r. g' u

" f# N4 `9 O8 ~+ V6 r3 W* v. s4 e, m% _4 W# T: H% i4 q: h

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐$ c1 `5 t% `& y# O; d/ s
: Y5 ~3 E, z( O) ?" {/ ~

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-1-30 20:37 , Processed in 0.044237 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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