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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑 " h7 J! V' A: d' X' v7 Z

) S# \% h) P) I  f/ m* S( K问题描述:
3 _0 f7 a) |' @# R$ w2 I/ F在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:
0 q% z8 w: z: G+ y" p
+ F6 E, d  D2 G( t图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
' q0 u) ^+ [: |- _# p0 M+ Y/ _! a  U( h8 t4 @* j- I3 q7 n
测试结果如下:
) l4 A1 J& k9 J' m5 B138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?( `# b7 Q# B, y- A, w" `
# n3 {" k- o. R- ?5 S

5 Y. a7 L3 F- k6 Y. N7 U' j2 T# Z备注:
( {# b$ `6 }2 h7 Q- O9 O+ O1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?% j8 I& N" S9 ], k  H: [' U% ^
2、相关代码如下:
  M4 m0 w9 o6 i! T2 _! U! q/ C) ~//UPP DMA缓冲大小512字节
) v. @5 y; @6 p& \, ]/ E7 O% r1 [#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
6 g' X) n, l: n. r) v' G#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT
, }; Q- P( g: w3 p#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
) o& Y% Z8 Z8 b! ?1 m  c7 C( {4 q' f/ u+ B& L% @" v7 F

! ?' Y! h; R: Q1 h$ Y3 k//upp接收、发送buffer( L) X! N! d  s: v( t
#pragma DATA_ALIGN(upp_buffer_a, 8)6 T! @; p) _6 n4 w
#pragma DATA_ALIGN(upp_buffer_b, 8); H% X5 i* S( t- F9 Y
: F) r" J5 ?2 n/ L! q/ p! g
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];' V& M. ]$ c; Q! R, K, g5 ]% z
unsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];) D. q9 v8 c. G1 v8 J  N

! {1 L- j# E3 e5 l. ?* T
) P) u* F3 h( V0 g; |static bool server_upp_data_recv(Server *server) % n- }/ M3 i/ A, ]: p+ i; W5 W( m4 ~
{9 |7 K7 F" ~! Y' l: X
    if(server->upp_channel_a_recv == false) {
% R) U/ f. A4 S, P        server_msg_send(server, APP_CMD_LOG, "upp recv: start");  o# P! A& A) p% G
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {
5 y6 q& G! F7 k$ {0 ^0 }; _            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
; Y8 |/ q% ^9 ~4 ~% ^5 Q0 Z
: X4 G& J( y+ ]; n8 c! q& `$ ~
4 t4 n1 m+ d$ c9 F. s            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);, h- E3 b8 C; T$ [( `# t
+ _# b: A  F' x3 ]4 w' H9 P; h
            server->upp_channel_a_recv = true;//
5 L3 k$ x( N9 u$ l0 V            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
) U; Z& ?7 E0 T( d9 g            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;& i# {* Q  U6 T9 n9 Q" m8 u- m# j: O
            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;2 g' e9 E2 U6 c; W
            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//$ y# ^/ o: K4 h5 j

8 U0 Q1 s  k4 \6 e! H            upp_error_count = 0;
5 q% h$ s1 m, K. F7 f! P) }% E            upp_dmai_int_cut = 0;! E6 Z( \# v0 U2 Q1 H: s2 `

& j5 }7 r" O$ ?5 E: y: c9 z6 v            // fill in data
8 w: I2 s" s3 A2 n# [( G7 A            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 }0 ]& L4 [! |: E1 T
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");! k% T3 y* `' [$ `8 Y) [! q
        }- P; g+ i9 M0 ?% X6 E
    }, P1 @1 p0 a$ R( B8 }. c* N
    else{
& n" m2 ?! J$ g# Z' Q        if (upp_dmai_int_cut > 0){! k( n* o/ i! a: _+ R
            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);4 E1 k* v$ w" D9 }
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);
/ v+ Q5 P; O) [# F# t; E5 F/ S% I+ Q8 ]: j0 T4 g. Z3 R% k, s
  F' r5 h) f! I4 a. f6 b1 u
            //copy data to upp_recv_list_busy
+ k% @; D7 E8 r& b5 _1 p5 ]            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);7 F9 O0 V* }, w* A
* E" T% [1 o( I0 e
            //
- Q) o  ~5 y/ \7 n! c2 Z            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);# g: P- `7 W/ i/ d8 m
! m: m% \& M( ]& z+ f
            //+ m) R) o8 K' [. L2 _
            server->upp_channel_a_recv = false;//
4 x2 @9 [) ~1 ?- |% r. K, `; u
8 a, ?# ~7 I4 b& s+ s            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
; {4 {& B6 ?4 L" v1 G( d1 y        }
+ }2 z  s- B. I8 [( C    }
& s/ ]- X: [. Q, h9 z/ r& c# _1 Z! \" {2 g
* C: F0 V+ K  ]- B0 I9 d. x1 O
    return true;6 Y1 R* a+ d, S2 a" X9 m; S/ Y
}  @; @( ?9 U& z- \# x8 V/ W1 x
$ T2 @$ r; ]& b4 h$ ?- {
static bool server_upp_data_send(Server *server)
; y6 v* u' Q9 n{7 d0 R$ U3 D. Y& d
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){
' ], _. {5 Z9 t+ t; L  b9 A, T        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);
5 q3 }5 [' M9 S  Y3 E        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);+ p* G) ^, V' `, ~
        char tmp[128] ={0};
7 O5 V1 r2 w& N/ t) H
$ x: O. j' l7 }% {        server_msg_send(server, APP_CMD_LOG, "upp send: start");
& X4 _! f$ y6 Y5 B: N        print_log(server, data, 64);
2 R+ L/ s+ k# V9 v$ [- [' j' ~4 o- T8 ?' z, X, t4 m8 x1 m7 @" t
        //2 G. n- c% g4 A: U" Y4 h2 H% F
        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);$ ]; N" \" n8 i; q
        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
9 m" G' ?% q) l/ D8 |        print_log(server, upp_buffer_b, 64);5 Y) P% o7 {/ @7 L6 f

; v" G" ^' {# ?5 m4 s        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);
3 r: J# M' D4 E; _, C        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT;
& B7 B5 p( Y% X9 _+ K        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;; |$ E$ ?3 C6 B! z2 Q8 s
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;  V) W# ?0 D/ e" z4 @

1 f2 j! {( p) g        memset(tmp, 0, sizeof(tmp));5 P* D6 X8 M5 f/ _9 N, @; c+ c
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", 8 {- o8 F+ r; |
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);
+ \% \% `; v% n2 }3 S) X6 J        server_msg_send(server, APP_CMD_LOG, tmp);! }, X' I: N# M3 T
( Y. j+ b& G9 y' B4 S
        upp_error_count = 0;2 S4 z; O. {% z
        upp_dmaq_int_cut = 0;
. l! z% a, P; X: f2 n/ ?  n/ s        // fill in data ' z; z) h9 w, ?1 l/ G+ B
        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
) t8 a; b* n. Q* Q& R" d8 N  k        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");; D; s* P. c, B6 ?8 P

& G  |, Y6 ?( u        // wait send success
+ e8 o1 H  M$ R& K5 @3 [* ~        while (upp_dmaq_int_cut < 1 && upp_error_count == 0); 7 G6 \0 f0 i0 [) j* M. V; s
  A9 n+ N0 K3 ^- |* R
        // make data node in free list   L% q3 {( q, D: Y! t3 u! f
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);
# |' x8 N$ r* Q& O! \; c        server_msg_send(server, APP_CMD_LOG, "upp send: success");
0 X3 ~- r# }' |: m/ `6 k/ q, N    }
! z7 w% z% n: j) }8 l    return true;
% Y$ J4 @# g; e" h. [}
* S  B" p0 o+ U: ?1 {* g" T% H- G% k5 f6 W0 K0 i# X" U

$ ^9 i) i8 f% \' A; q; z7 O0 p/ {
( B, P& o8 m5 H( z6 a/ o8 I& U

% @2 m8 @5 [/ U4 c# x$ ]
' V% \' J- S% ?

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐
/ K$ ^: E* {- {" b2 k# D/ L+ ]0 \% ~/ t  U) f9 K: n* _

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-3-3 01:11 , Processed in 0.052853 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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