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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 . i: u& g  j: u( H% y( e# G2 f# [

# B- G8 c" w7 S, Y问题描述:
" G) |& x& X6 i( U5 q; ~  P在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:5 W. R6 u! _, }# ^$ [

9 `8 P/ g3 s; _图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
* a. R% F% }) P6 _, J1 _# K/ c$ o5 j% A# t' S& S* ~: s4 k% _
测试结果如下:
5 X4 n+ D3 z% b9 E+ ?138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?& B" y" Y' }' P1 R# D
- m# `- K. l4 n& z) b9 h+ @
  c6 `; P; U; ~; w
备注:2 s2 g7 _& a/ _$ L5 ^+ J. T
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
8 B7 X" \0 @" R; k" c' k
2、相关代码如下:
  u4 r# D8 ?7 }" b5 f6 N//UPP DMA缓冲大小512字节( ^9 r: t9 @9 c: _6 b% l4 y9 n  q; U, v
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
8 K; [  |5 u, n#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
7 o* E) C; F+ A7 w" C: d; ^1 M. @#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT), t5 h5 s; p# U+ V9 b

: F/ X% }% L5 r2 H! ^( `  V( R3 Y+ D) S
//upp接收、发送buffer9 t, T+ u! v4 I4 ?
#pragma DATA_ALIGN(upp_buffer_a, 8): Z5 e- c, h; R) u& V
#pragma DATA_ALIGN(upp_buffer_b, 8)
5 g! `# H8 k4 s4 k* {/ }5 j2 |3 K8 Q6 K  K8 l& w4 D" m) S5 z
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
8 ^$ z, Z& X: q0 h; Gunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
: r9 W$ K% A* q$ }( l9 _& o: y: j6 i; k, ^

4 Y6 |0 U5 k. N6 q/ [6 Pstatic bool server_upp_data_recv(Server *server)
/ ?4 J) h! i! O. g2 A9 ]& D! h{/ R  B' k0 X6 C- l" S
    if(server->upp_channel_a_recv == false) {. L7 t1 `, j; J% n
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");
+ Y0 Q/ e3 S0 O# N        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
+ P0 R/ ^0 x0 ?& V, }4 {            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
" Q$ p' `1 R" ~% D4 H( C1 ^" q  K& f8 J5 H8 C/ {

5 I( k# T! X! o- ]1 i% e            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);* t" s" w1 G8 E" v7 j4 u; `

, O" H& j! ^5 Y/ B            server->upp_channel_a_recv = true;//+ W' B7 X2 _+ ~: e. ~  p
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);& b1 s2 e. z* Y! ~* v
            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
8 o+ q3 Z( S  P  j8 O% |            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;6 |3 \3 [+ T7 ~( C) x. M
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//9 b% Y5 M; q6 l% E/ H
( ?+ x% @5 K: m0 i! r/ z/ G
            upp_error_count = 0;
* O! U4 E; ]- k  B6 P            upp_dmai_int_cut = 0;; }* Z8 x: n, r: n3 D9 Q9 l
/ @! O) x2 s8 Z1 p3 ]7 `. T9 [
            // fill in data
- C  X+ Y: q$ m0 F( L+ o            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);; b& }  g% `. n+ L" D- P0 r
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
( `2 F4 d. p1 g9 O' x6 u; X        }
1 j. v& ^5 w$ a+ e    }! _  `+ M; @& S
    else{
: A0 X* D, _$ z  `8 U( W* a2 M7 q        if (upp_dmai_int_cut > 0){8 \! q: a$ ~% i( W! J
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);2 C& G/ j) `% j8 o; f
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
7 l0 {& o) m& D& k
6 P+ b4 W5 C1 L# V1 d9 U# s4 o9 m! r( R: x" y7 m9 E
            //copy data to upp_recv_list_busy0 o4 d+ j4 O; P( o
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);2 L9 a) w+ ^1 X7 W+ F
$ D# s9 _) O! J
            //
# I3 {6 P' R0 [8 R4 O3 q            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);7 k5 K( q* e7 p% a
+ Q, J. j! N, ~) ?
            //
1 {0 i& [, Y! }1 o, k+ |$ q            server->upp_channel_a_recv = false;//
5 L+ f7 H1 P, U, U4 g2 T- {: N# ~3 B, D4 T( ?
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
- V0 e8 Q0 r5 D. k: u% w9 Y7 a        }
' Y& F2 c$ Q. O1 q. W! w7 H% k    }' E0 x. k# i4 Z& q; j  r+ Q, Y

4 D: d5 h. K& X4 c/ H+ @
: E: F8 q$ k* G6 Z" g    return true;7 K) h  l; A5 M9 t/ R
}$ U  c: s4 V7 `, O# K3 N' G

0 m6 N' m* Q) }2 U; x; W6 i; l7 ?4 nstatic bool server_upp_data_send(Server *server)5 b6 ]" V& M- W2 p0 e" r
{/ R1 }+ {& y+ c9 U+ n
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){6 W$ y. I. Q. k  k1 s8 r; g; Y
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
! D' Q+ h* e: d/ d/ ], ?1 f        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);# `( i0 ~) f% L- S' N: z' K7 N
        char tmp[128] ={0};0 Z4 j0 G+ w! t. u

5 o' H( A. o8 l( \4 X        server_msg_send(server, APP_CMD_LOG, "upp send: start");1 u2 E' G& I& H0 D) j
        print_log(server, data, 64);$ a- [0 k3 {7 P8 f0 F0 q% u

/ k/ W3 d5 n; v# ?1 Y$ C5 Z. @: Y        //
9 P6 @- B' Q; ~- y% R  z+ ~        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
- \+ @$ f9 M- ]: A        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);2 f! e6 `: f: m* c, O8 e
        print_log(server, upp_buffer_b, 64);! d: W0 J3 }' x2 _0 d

9 v  O# L! v3 {' _/ |" w        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
. r' p9 t+ L) U" P        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; $ p' K" z: d1 q0 J; J+ f
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;
6 I, Y9 ^+ F. U" ^  I1 G8 z        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
1 z  N# _; N' B) ]7 }9 Y9 y2 I" {
; r& A; g4 h9 W# q* ]" ~6 v9 l        memset(tmp, 0, sizeof(tmp));. L9 h0 o# y5 j8 P0 \
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud",
( w1 s; T; N' T* W6 A9 T            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);( H& c8 r. v0 d
        server_msg_send(server, APP_CMD_LOG, tmp);2 K+ n8 v  K, p

( [& |; c. f7 c        upp_error_count = 0;! T8 ~' t6 }9 u# z  Q
        upp_dmaq_int_cut = 0;. O5 x0 V$ n$ m, [/ \4 U
        // fill in data $ n* q1 }, F; i, I2 j2 U
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB); " U& [( h; S1 P. z4 f
        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
! ^2 @. h* N2 h8 R0 m* V
- Q9 x6 B2 T: E4 B. P0 Y        // wait send success( n; m; Z0 u5 `7 B( F& A
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); * h- U, E& S% A% B2 ^! F

$ }% Y) `8 ~; r; R0 D$ ~' x9 S        // make data node in free list 3 s+ h- \0 d7 V: B; y
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);7 ?% g5 Z0 c, R) |( Z  x
        server_msg_send(server, APP_CMD_LOG, "upp send: success");
: A) h# C: K& M5 A. z3 D    }( |, c8 n+ {4 d% C9 q3 O
    return true;0 q8 U8 l5 g6 ?( s
}7 R8 i/ T& V8 R1 ^" _

9 y/ ]* {, O7 G$ c* W' t
5 S+ A/ o% a( u" i( f: h

5 \) ^+ F; x8 S8 B( P9 {+ s

& Q4 h% A. d" x' n/ A
! Z0 x; k( a7 z  A  x$ J3 J

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
) L- z5 b3 o& G: D' j6 n# r, C3 \7 q3 g0 o

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-6 02:42 , Processed in 0.044035 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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