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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 0 l5 A$ R3 E7 o8 n, i! h/ l0 Z! i
0 h& s8 J& r0 H1 N& m
问题描述:, ^  L0 J: }8 ^8 ^0 t
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
$ R4 c2 B( \$ s7 N
0 n$ i6 e; B# _# c! \( k* j9 c图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。! C0 [5 [& s/ n5 o: @, @4 [- ~
, h1 ^: _4 E. |* H
测试结果如下:
- q5 ]% e) l1 I9 V5 M+ \- S138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?. e5 ^- o/ }( N) e: j9 P
4 F4 U- v: S+ z7 U1 @0 k; Y, K; n! p

- P$ {) G( o! V* R2 Z4 c+ b7 ^, I备注:% t. v  f* w8 t! g
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?
& [. ~1 e- Q+ ^3 K! ?. N
2、相关代码如下:
+ |9 P' m$ @8 N: u//UPP DMA缓冲大小512字节7 e1 x$ r9 G' Z0 f6 `0 y0 }
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍6 \1 Z6 V, Z5 p2 U
#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT* V) t" s/ a: \2 u0 x! Y  {
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)6 q0 m0 o& j, g  G8 C* P# D# N7 t5 i
: R* E+ @; z& f

$ H5 n) E2 U3 R' k6 O: C7 m% y//upp接收、发送buffer
* m+ D& Y% t, ^- R- u; f1 I, \$ z#pragma DATA_ALIGN(upp_buffer_a, 8)
( x; j6 T4 o! b#pragma DATA_ALIGN(upp_buffer_b, 8)1 J- `2 i1 ]  ]1 k2 k1 T" R
! o5 d; z7 f* y* r+ d  ~
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];4 h# A! i" }; M0 g1 h+ y& p* v
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
3 K6 x, h( ]' e/ B  x" @5 V" J" }0 M
" F3 O" F5 g: C5 C; r
; {$ z4 p; ~2 |3 Gstatic bool server_upp_data_recv(Server *server)
9 X" n9 s' s- _7 A{
( ]0 @7 r! J  N    if(server->upp_channel_a_recv == false) {
$ |6 T5 `( I7 J) q        server_msg_send(server, APP_CMD_LOG, "upp recv: start");( Y$ Q* M4 v3 \8 u* I
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
! e* _: _3 ?+ o* c* [- m% b            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");5 t$ K8 c3 w8 X
8 k8 \" M1 V2 Z! t& R' N( H
6 P6 M3 z) s$ C. t; u' C) w
            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);
' J! g4 x, ]5 O9 e8 ?  T8 Q  \" D! \7 Q. h
            server->upp_channel_a_recv = true;//
+ i% A* n' Y& x            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
0 f% a% I- Y9 {) r, ~+ f' P) t            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
7 j6 {+ d4 Z0 [1 I$ w            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;+ w( K0 j/ d, X
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//7 ]; y: @: i. I  H) w" D- Y
* K, k1 m! w$ j
            upp_error_count = 0;; R. ]( Q, l( J
            upp_dmai_int_cut = 0;$ y1 @% O$ T1 \5 C; c0 h

9 y- x& o0 m* n% ?2 a' C            // fill in data ) j8 q% G! U" r1 p. y
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);
% S6 J, i* X' ~, K2 q            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
: Q- {  N8 \9 \% v4 @+ c        }- X! o$ c8 p. g; ]9 A
    }5 }' u- y# u$ ^( {! V. y
    else{
. C9 K) r' [4 `' o        if (upp_dmai_int_cut > 0){
2 B: _$ [$ t9 X8 [            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);
/ i& X) f7 T$ h* `1 p$ o' I, ^3 y            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
/ K6 ^# j# m$ W* s4 d; C8 \) K$ U5 G/ }. b. Z& t; ^7 w

, Z9 `: a6 v4 g9 \( H            //copy data to upp_recv_list_busy
# F; g- Y2 F% n2 \            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);
& V! a3 I& I& H) k& `% h1 \
5 ]% X: B6 n0 \# E( t/ {+ L            //
3 c$ U9 O7 R4 g* Z: E2 Y7 L0 S            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);$ A) n9 x2 @! a, ]! B0 x5 E0 t8 p! C
- M8 G/ j8 Z/ R8 U
            //
& B1 j  P$ p* _) H+ e            server->upp_channel_a_recv = false;//
; G0 T3 W) \6 r4 v- {2 _; E  \7 Q! M+ M9 ]5 C$ I# A4 k
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");+ I4 Z9 ~5 C0 i" K
        }
/ W$ j, k! r' M+ n: z3 R; J7 ]    }
* ]# L  p; M3 O; `
" D- J. [" ~5 o2 u/ Y1 c- ~/ E" v( y3 I4 o5 E% G1 b
    return true;
0 B5 L+ S+ @, T0 o$ t0 J}7 H) q- P& u7 Q" D; V* [9 D. Z$ C

) r' ]5 S" M5 U* [6 Z7 ~" Qstatic bool server_upp_data_send(Server *server)
* E8 y( u# E, _9 l- u; N{
1 k, q: x& C, {* J# V    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
: A/ Z: B- @  U; u        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
! S2 p* ~$ Y  t' Q" o% C        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);
( }7 Z8 \5 c1 D* w4 N8 |        char tmp[128] ={0};; }: d; [& O" L- b5 N" g' c
" {" X& d0 E$ X; |
        server_msg_send(server, APP_CMD_LOG, "upp send: start");3 k9 t8 }$ h% s  t# _% x: m
        print_log(server, data, 64);: A: u3 B$ m5 B8 W

, h: d9 P8 i8 A* E  N        //
' F6 P! A9 Z4 K( ^9 @/ V4 Z- w        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);) J/ \1 s* X( d5 j- Q: E
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);* @' H# e( r; S  l
        print_log(server, upp_buffer_b, 64);4 V* K7 u+ \/ s6 D
! |. n& ]3 `! J& O
        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
, M4 A4 O6 A$ H0 j8 t        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ) A! l4 ]3 m' R- r, E
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;8 \( B3 y9 A' q4 H% v$ @6 b6 X
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;; s5 |- ~. ^2 q7 l2 d( T
5 \# k6 w$ X' s9 R! g
        memset(tmp, 0, sizeof(tmp));
1 t! {4 T5 X3 w$ K6 A% m! ?! x) a9 r        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", & B! {) F3 i4 {& ]/ Y, \
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);* q2 w; u+ n$ _' h+ u, o
        server_msg_send(server, APP_CMD_LOG, tmp);" c: D9 p' z7 L' `8 b$ h' u1 z6 o
2 b7 c0 {4 z1 {, B- V: H
        upp_error_count = 0;" F- i# a  W2 W0 r- ~. ?
        upp_dmaq_int_cut = 0;" K8 a5 K1 X8 K8 b. B* N8 F( J
        // fill in data
" U% K) Q' \  p        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
8 x* Q9 u. `- I) N. o( ~        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");
% r. a) w- `! i/ M  w7 n  O: ?/ H, G  L! ^0 E3 E, f, \
        // wait send success
. p. j# c& g, @/ W& u        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
) C' h  w2 N4 [# X$ E2 }4 E$ R2 h, ~5 m. u/ q- X
        // make data node in free list
- |0 B! X# F7 s7 d; d& a& r        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);; u/ `9 H" P' Q! ~7 n3 b7 [
        server_msg_send(server, APP_CMD_LOG, "upp send: success");2 U# t4 h3 U, {  O. L# x* [9 p
    }
# F% M6 M8 a* W5 X    return true;& T; f& z5 @1 D
}
6 r& \" U/ U7 `+ C0 u
  ?6 R- H1 o+ L  l, W# j

# J( ^5 s. n' \: w1 u
5 W* X% ^( N4 Z- m! e

- h' ^- {$ f+ k2 [! Z4 E
$ W1 a) T) X& n

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
  x, i/ x  r' Q- }+ l
% s/ k' l* i% i2 f

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-2 08:49 , Processed in 0.043790 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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