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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
$ Z; W/ q, H/ B6 ~4 i' L9 M
( b9 v5 B; p" @$ M# Z2 k; @问题描述:
0 t( ]+ I4 \3 e* U" p4 u/ ?+ g在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:" N, z. p. s/ O6 y: c( O  x& e

9 K- O5 M/ ?' |$ j* j1 R图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
% t* V3 q5 q! r& m/ l+ r. O$ m# [7 S/ z/ z* F2 b
测试结果如下:
7 K) d% \% M9 ?- c0 ^138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?0 {- ^; G) H6 j8 Z8 o/ T' O' x
: Q) h3 t0 ~# ]4 i! i
1 y: V" B9 }, h2 |# \" s; W
备注:# E$ o4 O1 R. @5 \0 _8 p
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?" X: n& z: `% U
2、相关代码如下:
. W! R2 U" H& g  h+ Y7 Z//UPP DMA缓冲大小512字节9 d% A0 A" L" y% I4 X
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍  ?4 o  q, O* D
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT$ E' A4 f5 q8 T* g* l* J
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
4 S1 }* t: }: v4 b) p4 T6 ~9 x4 l' B/ n/ D; [

, s5 \9 F$ j6 r0 s//upp接收、发送buffer
/ c+ Q  W6 e8 Y# `" B  g1 |#pragma DATA_ALIGN(upp_buffer_a, 8)
& k" V) T" O, d! b3 |#pragma DATA_ALIGN(upp_buffer_b, 8)0 K& m" y. `1 n; y) p! b/ g. Z' y! S

: T9 s4 j% V5 w4 Iunsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
. H! B7 f" M; n( h. o( v- zunsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
; w1 p7 n* ~( B0 W# F8 g- m3 n
1 ?  c  K% q, }+ q" N  N% J' P+ P& K* |5 D7 ^% l$ `& x! `. }
static bool server_upp_data_recv(Server *server)
* x+ N! M! [! Y$ R" c{
  z- g- q- b* f1 O    if(server->upp_channel_a_recv == false) {
. _4 q; O, S4 `& ]3 s/ W; @0 |        server_msg_send(server, APP_CMD_LOG, "upp recv: start");" z* C4 a* |) ]0 N5 f# x: E
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {- \8 I7 O$ l, U/ M  |) S
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
) D1 Q% G, x- B' n. C0 l# i' ?7 p2 o
+ o! ]7 r: v" ~) D# T
: ~5 e. Z' Y0 M( Q: X7 W  y            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);3 Z/ h% m; G* \; H7 P9 t# \' t

1 t9 `& z/ A5 Z" R7 l$ }/ r3 s            server->upp_channel_a_recv = true;//
# M' X" {) l  |  |) R+ |& K            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
8 h8 H8 Y% G& ]( E, ~            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;1 D0 y% f8 q4 `0 M0 X' i" L
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;; \* c- }& B# ^( R9 i  f& e. H5 U
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
3 e6 p* l9 I! E: t! v% v) N1 @2 A
0 P  ~1 {8 Q0 y6 \# P4 k: a            upp_error_count = 0;$ N8 {1 ?/ Q: \6 ]( N8 c4 ~+ m. N
            upp_dmai_int_cut = 0;
. J' o9 o: j) D1 u7 `9 d3 w* d# r  m& Y! X
            // fill in data
+ k- c& s6 p8 y* V0 m( p! G; g            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 |! E4 W- b# L0 d8 |6 i
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
1 c. s" k* D  T& m+ w; T        }
" i# P! h/ e- W/ G- R    }! W/ h  Z# N" V+ K" ~) c6 S
    else{. |# N' i- z. z+ l
        if (upp_dmai_int_cut > 0){1 k9 B" K( W. W2 Q" W
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
0 m6 {2 f" }* t- X            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
- ^9 q1 X: u2 P+ i0 V0 t2 e" V# Q! f3 L7 M! s, `& e% {0 F
* R* c9 Y: I$ O+ w* B
            //copy data to upp_recv_list_busy9 H3 Y# E0 G+ L/ b
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
3 D& ~, p: M0 T1 Z; Y
5 u+ n/ A- ]: b' w4 @            //
) ~- U" m% c( U; m8 k            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);
' h3 p3 _: C- ]  p9 r1 l
! P( V  C, N! ~! W% L            //
% ]* _8 C/ g( L1 M  P! o            server->upp_channel_a_recv = false;//
# \6 ~5 s  Y/ w& T
8 b) ^) X4 L7 u7 E: z0 @, u            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
' }% w' d6 \, c0 W        }
0 a* r& z$ |2 a    }
; o: C# t3 y1 A( ^7 T$ b; @1 X! F+ G! E/ S

9 D1 R9 H- {0 D/ H1 V0 S    return true;
, Q$ D+ {2 K. B. X9 T# b$ ?}; K5 Y  r, Q) i- p
: S. B- V, f/ v5 |: |' w/ h
static bool server_upp_data_send(Server *server)
; O7 V( e+ g$ ]. z{
4 q3 L: n$ d, [+ r# I    if(ListMP_empty(server->upp_send_list_busy) == FALSE){% c& N: h2 W) R$ g& G% P
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);( Z; ?$ T" @: H) x; Y7 M5 c
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
1 `; w* o! q3 O        char tmp[128] ={0};3 y  m4 j& B: [, N  r

% [$ D1 q' X  P  V        server_msg_send(server, APP_CMD_LOG, "upp send: start");
  S" D% X. ^9 ^7 S# X) C8 P9 L% C        print_log(server, data, 64);
6 h0 D- ^' J, Y6 E9 s) L
2 ]. e; p2 O4 \1 N5 b0 k, B( p        //
. N  g' U  l( u3 b) ~        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);  W+ K$ V# ?+ r! G8 p) _9 j
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
' e6 g% @2 q1 }) p1 W0 q! t) U        print_log(server, upp_buffer_b, 64);0 i! S' [# z4 F7 K' i9 f

/ y$ w4 S% v9 _8 k# O1 s        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
. b9 }5 u4 o: @# `) Y        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; 3 S; B$ ?# i7 f
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;+ i3 \2 Y+ |) N9 E: r6 W
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;( b, p+ ?; c$ ~: e9 m% W" `
/ J6 C2 Q8 L, _+ ?7 j
        memset(tmp, 0, sizeof(tmp));/ n: u8 o- g1 O+ q  A) k0 m1 T- P
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", - o+ w1 L* a5 p7 f" m2 N  W
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
( C# v: J, ]1 z- `, f: i; h        server_msg_send(server, APP_CMD_LOG, tmp);3 [" X" @  i2 r$ u
* K& p# Z" H& V. |/ a$ D
        upp_error_count = 0;
( J7 r, r4 _7 s+ n6 S        upp_dmaq_int_cut = 0;" n1 d2 C- v  q+ \' L! Z
        // fill in data * y, p7 p$ d: y& J/ v
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
/ n* A- j" o* ~, g$ L. v        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
0 L2 v" r; i; \- s: I( ^
7 L. F* X( R; u$ _7 O        // wait send success# T" F, r8 Y& \& ^+ k. T
        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 1 `; b, U3 E2 h: p% M5 C
, @* k/ M5 j1 N" U3 m+ l: O% ?
        // make data node in free list + I' d7 B, r/ _3 k
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);# p& D$ s: a$ A0 n  T" v
        server_msg_send(server, APP_CMD_LOG, "upp send: success");' c0 b* X" x: K5 i3 ~( [. f
    }4 ^& a8 f- E3 C0 D5 O
    return true;
& a  N, j) f3 t2 F, ^' {% E7 L}
% _$ C+ |  @7 F7 L+ c* D/ c6 c+ Z" X5 J! {) H# x  A9 E0 m- t9 E- q
$ u6 y& S+ _& j; i
6 e  T2 T! Z. f8 J  i" }

& V' s$ q' o2 X- @. O. ^) ?! p- V$ }; D  A' Y' ]5 c0 F

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐, C: L& X3 ]$ J* D

" G4 _  `6 |; F% G( G

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-1 17:24 , Processed in 0.057866 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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