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

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[未解决] 138 Upp问题咨询

[复制链接]

20

主题

24

帖子

150

积分

注册会员

Rank: 2

积分
150
跳转到指定楼层
楼主
发表于 2017-4-11 14:43:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 liangws 于 2017-4-11 17:00 编辑
2 y4 ~+ B8 R7 w3 u, V
, k4 g, [3 @  p. u' ^1 L: p9 F问题描述:4 O, K, k: F% q1 p+ }* A- [9 D
在syslink模式下开发upp,在138端参考tl-upp_saver程序通过channel b发送数据到FPGA端,FPGA接收数据到FIFO,然后从FIFO端发送給138的upp channel A。fpga端程序通过仿真没有发现什么问题,具体方针波形如下:+ w( A4 v# ]+ I/ S

! I4 N# Z' k. T) A图中的UPP_CH0*对应于138的Channel b通道,UPP_CH1*对应于138的channela通道。
9 d# i6 Q7 y1 a, e* d- u+ F7 M; L& ^8 U+ B! @
测试结果如下:# d) i+ c& z9 U5 m: {
138端发送512字节,要连续发送8次,即8*512字节,接收端才能收满一个512字节数据,这个可能是什么问题引起的?$ L* S" X1 z) d- G+ b7 p
9 J6 F8 A0 m5 J2 ~+ y+ m7 \! O1 H
- J+ ^  c. F; M( |( U3 Z
备注:* e! e- v. r" u% K& [/ r9 [; z
1、看了upp相关文档,绑定的窗口地址WindowAddress要8字节对齐,tl-upp_saver例程中只有发送端upp_buffer_b有8字节对齐,接收端没有8字节对齐,这个是否有问题?我上述问题是否由于这个引起?( E' Q! y' e8 |, @% ~: C
2、相关代码如下:$ {$ S$ H* H( R9 B
//UPP DMA缓冲大小512字节) u5 v( N, b! x1 v) O9 a' j% U" L0 i
#define UPP_DMA_BYTE_COUNT  (64) //DMA行字节数,每行64个字节,行的字节必须是64的整数倍
. B1 z/ z! e6 W! L2 e$ m#define UPP_DMA_LINE_COUNT 8 //DMA行数, DMA行数 = DMA缓冲区大小/UPP_DMA_BYTE_COUNT% l. x/ V: D5 B& D1 _: E$ X
#define UPP_DMA_BUFFER_SIZE (UPP_DMA_BYTE_COUNT * UPP_DMA_LINE_COUNT)
+ J/ N* i5 S1 W1 h7 l. ?( a
+ y/ R+ f" w% y& S" w! m2 s" T: r
  h% `4 S. Y. y2 k3 ~+ |! Y( s//upp接收、发送buffer
  e2 p7 w7 K# E  c$ E9 }; f#pragma DATA_ALIGN(upp_buffer_a, 8)
  c4 `: w+ ~0 [: e#pragma DATA_ALIGN(upp_buffer_b, 8)1 ]7 x# y! Y' j' q7 y7 Q
) |: H7 q2 |2 m0 o# @' G
unsigned char upp_buffer_a[UPP_DMA_BUFFER_SIZE];
! ^' G0 s# V+ K* M+ Y: Ounsigned char upp_buffer_b[UPP_DMA_BUFFER_SIZE];
, j7 H4 `; F" w8 y4 f/ V! ^7 d8 j4 @. b7 _
+ x; \, b! b2 |
static bool server_upp_data_recv(Server *server)
8 L. @- y, w  m* i  i{, {! x: N' V# L8 `: E, T
    if(server->upp_channel_a_recv == false) {5 Y; D9 c9 U6 G8 f( b( E- ^& G
        server_msg_send(server, APP_CMD_LOG, "upp recv: start");  Y- U/ u9 p- F; Y
        if(ListMP_empty(server->upp_recv_list_free) == FALSE) {. X  y4 B* p  {- B# i
            server_msg_send(server, APP_CMD_LOG, "upp recv: get node success");
/ ]9 _2 c4 |2 i0 N+ M. P
5 Z, }1 ], i1 G
6 d. k0 ~  ^; B' I            memset(upp_buffer_a, 0, UPP_DMA_BUFFER_SIZE);% f! `( j! d! B8 e& J
1 V6 r& R& L) M& o2 b# Z
            server->upp_channel_a_recv = true;//' B& d( V: p5 L# R: s
            server->transposeParA.WindowAddress       = ((unsigned int *)upp_buffer_a);
% C# j6 t6 j, b3 ?# l7 j            server->transposeParA.LineCount         = UPP_DMA_LINE_COUNT;
+ D  u6 D( V$ h+ s6 n9 v; K, z+ X4 w6 d            server->transposeParA.ByteCount         = UPP_DMA_BYTE_COUNT;
& f7 |9 d0 V! J/ w4 ?8 x# Q% b            server->transposeParA.LineOffsetAddress = UPP_DMA_BYTE_COUNT;//
' e  ?) u7 l7 B; w+ E. F. x, O! |, E
            upp_error_count = 0;0 j( @3 n# d- n1 I; ]0 X. g+ m
            upp_dmai_int_cut = 0;
2 Z- K: c" Z5 c7 [4 u9 c4 i" y4 ?( b/ w2 ]/ S" \  v: a# u
            // fill in data 1 J) H0 l8 Y$ g: D6 Y9 {
            uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHI, &server->transposeParA);5 H, A1 a* ^3 v+ r
            server_msg_send(server, APP_CMD_LOG, "upp recv: binding node to dma chi");
. M( g6 q1 o" s+ C" P& U# m% w, T0 V        }2 p, M: a. d* ^2 D0 n
    }
" V* w7 u3 R2 l( K    else{
4 b* {! l$ o% H9 g* Y5 S/ t        if (upp_dmai_int_cut > 0){
* ?8 z# z9 T4 {$ I) ]            DataNode *node = (DataNode *)ListMP_getTail(server->upp_recv_list_free);, F3 b  Q8 c, `  M
            Uint8 *data = (Uint8 *)SharedRegion_getPtr(node->SR_buffer);3 k7 C# k! X% ^  F- T6 ~! Z9 K1 S4 ^

, l8 Y8 W2 P+ @- P6 S7 M& Y
% v) I6 E) o) `            //copy data to upp_recv_list_busy, \, `( k3 n5 y$ l: m- N  k/ W
            memcpy(data, upp_buffer_a, UPP_DMA_BUFFER_SIZE);/ ~6 I' R% `% ~& P; C
( X" x* B# L8 u! t( z
            //
& D/ Q& @7 z) B) Q, X5 G7 F            ListMP_putHead(server->upp_recv_list_busy, (ListMP_Elem *)node);+ J0 |% ?( _- |5 n
  N  v3 j) u! ]5 a  j5 x, @
            //
3 I. j; A6 B% @  O' E            server->upp_channel_a_recv = false;//+ t- {" n5 \6 d
& f2 Z3 ?" r0 _0 `& B
            server_msg_send(server, APP_CMD_LOG, "upp recv: success");
8 z7 A1 @' T: \* A        }
5 h% I. C- x- _    }; f) p) w9 G- j( x# q# e
; C% U- v: U( L- _
: d* q# D% g2 u" s
    return true;8 j+ O) x5 J* ^, @) V
}+ f5 b+ C! V- j6 O

0 i! }7 f; y5 ~8 K6 w7 _. Ystatic bool server_upp_data_send(Server *server)
/ m  b% p' c$ r; M& E7 |( a" w{# l6 i1 u& M4 m5 O
    if(ListMP_empty(server->upp_send_list_busy) == FALSE){' A  O7 {3 D, U- I& r
        DataNode *node = (DataNode *)ListMP_getTail(server->upp_send_list_busy);# u; g6 `% V6 k" m
        unsigned char *data = (unsigned char *)SharedRegion_getPtr(node->SR_buffer);# X; W) x* ^; q5 @' L
        char tmp[128] ={0};! @; H* T; z9 A3 {6 K7 a& I1 ~8 n7 F4 h
/ c  Z1 B4 N9 A8 H+ L) X% U
        server_msg_send(server, APP_CMD_LOG, "upp send: start");
4 u' A/ b9 R! W3 W9 B' e        print_log(server, data, 64);
! X9 @9 s# t* V( I4 j1 J: p* i
# v/ r$ y% S+ _1 h        //
' w1 j$ e1 I/ O3 Z; B        memset(upp_buffer_b, 0, UPP_DMA_BUFFER_SIZE);
: d) ]% c, T! n9 l  l        memcpy(upp_buffer_b, data, UPP_DMA_BUFFER_SIZE);
6 J+ _) |9 ^, i3 f3 {% ?" o+ I        print_log(server, upp_buffer_b, 64);
. Y5 E( j2 {3 s4 n
) g1 z( ~- D( r) ]- ~+ M- y        server->transposeParB.WindowAddress     = ((unsigned int *)upp_buffer_b);  p) D+ v, E0 [$ G
        server->transposeParB.LineCount         = UPP_DMA_LINE_COUNT; ) R- p9 b* d: p3 n& X1 C9 _) r
        server->transposeParB.ByteCount         = UPP_DMA_BYTE_COUNT;$ h6 z1 Y" L3 O
        server->transposeParB.LineOffsetAddress = UPP_DMA_BYTE_COUNT;
0 V8 ~+ Y( m; [0 e, Y' z6 y3 ?) e; I. \3 D% H! ^* g; v3 k7 |
        memset(tmp, 0, sizeof(tmp));" B! K- S0 }3 G; Z" y' Q5 {! k: e( S
        sprintf(tmp, "upp send data: sizeof(unsigned int):%d, upp_buffer_b:%p, WindowAddress:%ud", ' e9 B5 Y; p# @. Z  B  R9 B
            sizeof(unsigned int), upp_buffer_b, server->transposeParB.WindowAddress);: O6 w% ^! {. X: s' J
        server_msg_send(server, APP_CMD_LOG, tmp);
& {4 a7 K  [  `( c5 z
5 [/ O% T! B( u8 ]* s        upp_error_count = 0;+ R9 ^* t$ b/ @
        upp_dmaq_int_cut = 0;
, R" U# F7 C+ V! q( e        // fill in data
/ U( f, B+ Q" ~2 m. b# V        uPPDMATransfer(SOC_UPP_0_REGS, uPP_DMA_CHQ, &server->transposeParB);
# |; \6 D% U3 |, F" ?0 J        server_msg_send(server, APP_CMD_LOG, "upp send: binding node to dma chq");; q' ?: y4 f7 N% T) {2 n5 Q

' O  d8 ]2 A7 g) V7 l        // wait send success
' C' q: g" C% N3 T; x        while (upp_dmaq_int_cut < 1 && upp_error_count == 0);
- G% P8 k- e( F# V4 y
' b& j! \4 D% Z& W5 S! l        // make data node in free list , M- [. ]5 C; R; I- p5 J
        ListMP_putHead(server->upp_send_list_free, (ListMP_Elem *)node);/ Y3 @: G& G' o3 P
        server_msg_send(server, APP_CMD_LOG, "upp send: success");- O% i! ^( ]' R5 d9 K8 r/ K
    }" N5 i9 [- n1 f. e$ G1 ^9 @
    return true;  }" H1 X/ X7 h/ s6 x1 n
}+ w+ l" u  M7 }. H
3 C. k  o) z) `% ]6 u

, h" K  v# l0 D1 ]8 w5 Q6 l1 R+ s' J5 e$ O) t* `

9 g6 w% S2 \' ?. O9 f* P0 W5 F& j  s! C

本帖子中包含更多资源

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

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

使用道具 举报

3

主题

852

帖子

3538

积分

创龙

Rank: 8Rank: 8

积分
3538
沙发
发表于 2017-4-11 22:03:14 | 只看该作者
需要边界对齐: |& E9 B, T9 d8 ^8 R8 V
! G. V* D  B3 B+ s$ \. I0 V

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2026-2-26 00:35 , Processed in 0.118894 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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