搜索
bottom↓
回复: 30

基于S3C2450的高速USB Device,模拟U盘(RAM Disk + SD卡),速度达到 3533KB/S,支持USB2.

[复制链接]

出0入0汤圆

发表于 2010-4-22 21:33:45 | 显示全部楼层 |阅读模式
硬件平台:S3C2450(400MHZ) + 64MB DDR2

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2010-4-22 21:34:40 | 显示全部楼层
S3C2450 USB Device 驱动源码ourdev_548510.rar(文件大小:8K) (原文件名:usb.rar)

出0入0汤圆

 楼主| 发表于 2010-4-22 21:35:28 | 显示全部楼层
S3C2450 SD卡 驱动源码ourdev_548513.rar(文件大小:5K) (原文件名:SDI_Disk.rar)

RAM Disk驱动源码ourdev_548514.rar(文件大小:727字节) (原文件名:RAM_Disk.rar)

出0入0汤圆

 楼主| 发表于 2010-4-22 21:38:06 | 显示全部楼层

调试信息 (原文件名:3865.JPG)

出0入0汤圆

 楼主| 发表于 2010-4-22 21:41:01 | 显示全部楼层
windows下的读写速度测试截图:


(原文件名:12345.JPG)


(原文件名:dfrt.JPG)


(原文件名:sddsf.JPG)

出0入0汤圆

发表于 2010-4-22 22:45:55 | 显示全部楼层
有板子的靓照吗

出0入0汤圆

 楼主| 发表于 2010-4-22 22:48:53 | 显示全部楼层
回复【5楼】quzegang 璩
有板子的靓照吗
-----------------------------------------------------------------------
没有靓照
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3324059&bbs_page_no=1&search_mode=4&search_text=liuweiele&bbs_id=9999

出0入0汤圆

 楼主| 发表于 2010-4-22 22:52:58 | 显示全部楼层
程序应该还有很大的优化空间,对于USB2.0来讲,这个速度很平常

出0入0汤圆

发表于 2010-4-22 22:59:09 | 显示全部楼层
不错

出0入0汤圆

 楼主| 发表于 2010-4-22 23:43:13 | 显示全部楼层
回复【5楼】quzegang 璩
有板子的靓照吗
-----------------------------------------------------------------------

在多线程环境下,通过USB2.0与从电脑上拷贝文件到S3C2450的SD卡,CPU(S3C2450)的使用率情况:


(原文件名:照片 2361.jpg)


(原文件名:照片 2364.jpg)


(原文件名:照片 2366.jpg)


(原文件名:照片 2369.jpg)


(原文件名:照片 2372.jpg)

出0入0汤圆

发表于 2010-4-29 14:01:43 | 显示全部楼层
顶楼主,强人一个!
有问题请教楼主一下,阅读了楼主先前发的关于“44B0点亮彩色TFT(ILI9325驱动)”,我也搞了一块320*240的MCU接口TFT彩屏,后来发现在LCD硬件和44B0接线有点困惑,请楼主指点一下:

我的硬件接法如下:

LCDD0--LCDD15接在44B0的数据口线DAT0--DAT15;
LCD的CS接在44B0的NGCS2(空间地址400000-4000004);
LCD的WR接在44B0 nWE(写使能);
剩下一个RS信号(写数据,写命令),不知道改如何和44B0相接,看了你的驱动如下:  

#define LCD_Reg_Addr (0x04000000|(0<<1))
#define LCD_DATA_Addr (0x04000000|(1<<1))
#define LCD_Reg       (*(volatile U16 *)LCD_Reg_Addr)
#define LCD_Data (*(volatile U16 *)LCD_DATA_Addr)   

void Wr_LCD_Reg(U8 Reg_Addr,U16 Data)
{
LCD_Reg =Reg_Addr;
LCD_Data =Data;
}

void Wr_LCD_Data(U16 Data)
{
LCD_Data =Data;
}

是不是RS需要通过一个74逻辑电路接在44B0(ADDR0和ADDR1)上面,当低二位地址输出为00时输出RS0,01的时候输出RS1来
区分写数据还是写寄存器的?

谢谢楼主指点!

出0入0汤圆

发表于 2010-4-30 20:07:50 | 显示全部楼层
看过了

出0入0汤圆

 楼主| 发表于 2010-5-4 13:08:37 | 显示全部楼层
回复【10楼】nopa
-----------------------------------------------------------------------

RS接A1

出0入0汤圆

发表于 2010-5-4 14:19:02 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-5-10 16:17:04 | 显示全部楼层
LZ 有S3C2450的ADS 工程文件吗? 能传个串口程序上来吗?

出0入0汤圆

 楼主| 发表于 2010-5-10 16:57:48 | 显示全部楼层
回复【14楼】liouravr
-----------------------------------------------------------------------


#include        "Include.h"
/*============================================================================================*/
/*============================================================================================*/


/*=========================================================================================*/


void        DebugPutch(char data)
{
        while(!(rUTRSTAT0 & 0x2));                //Wait until THR is empty.
        rUTXH0=data;
        return;
}

/*=========================================================================================*/

int        DebugGetch(char *data)
{
        if(!(rUTRSTAT0 & 0x1))        return 0; //Receive data ready
        if(data)
        {
                *data        =rURXH0;
        }
        return 1;

}
/*============================================================================*/


void DebugPuts(char *str)
{
       
        while(*str)
        {
                DebugPutch(*str++);
               
        }

}

/*=========================================================================================*/

void        DebugSetBaud(U32 baud)
{
        Uart_SetBaud(0,baud);
}

/*=========================================================================================*/

U32        DbgUart_DevInit(void)
{
        Uart_PortInit();
        DebugSetBaud(115200);
        //DebugPuts("DebugUart OK!\n");

}

/*=========================================================================================*/


/*============================================================================*/

static        volatile U32 DownloadAddress,DownloadDataSize;
static        volatile U32 UartRxCnt=0;
static        volatile U8 *temp;

#define        GET_DATA_HEADER        1
#define        RX_DATA                        2

/*============================================================================*/

static        void        ClrDebugUartRxIntPend(void)
{
        ClearSubPending(BIT_SUB_RXD0);       
        ClearPending(BIT_UART0);       

}

/*============================================================================*/

static        void        EnableDebugUartRxInt(void)
{
        EnableIrq(BIT_UART0);
        EnableSubIrq(BIT_SUB_RXD0);
}

/*============================================================================*/

static        void        DisableDebugUartRxInt(void)
{
        DisableIrq(BIT_UART0);
        DisableSubIrq(BIT_SUB_RXD0);
}

/*============================================================================*/

static        void        IsrUartRx(void)
{
        char data;
       
        if(UartRxCnt<(DownloadDataSize+6))
        {
                DebugGetch(&data);
                *temp++        =data;
                UartRxCnt++;
               
                if(UartRxCnt==4)
                {
                        DownloadDataSize        =(*(U32*)(temp-4))-6;
                        temp-=4;
                }
        }
       
        ClrDebugUartRxIntPend();
}

/*============================================================================*/

/*============================================================================*/

int Debug_Download(void *pdata)
{
        U32 time_1s,cnt_1s,size;
        S32 i,j;
       
        U16 checksum;
        char        key;
       
        U8 *buf;
        char str_buf[64];
        char *str=str_buf;
        ////
               
        DownloadAddress =0;                                                        //Init DownLoad_RAM_Address.
        UartRxCnt                        =0;
        /////////////       
        DebugPuts("\n**** Uart Download ****\n");
        DebugPuts("Enter The Download Address:\n");

          ////////
          DbgUart_DevInit();

          if(!DebugGetIntNum(16,&i))        //获得输入下载地址.
          {
                  goto ret;               
          }
        ////
        DownloadAddress=i;
        DebugPrintf("Download To Address: %08XH\n",DownloadAddress);
        ////////
        if((U32)DownloadAddress<=0)
        {
                DebugPrintf("DownloadAddress Err -> %08XH\n",DownloadAddress);
                goto ret;
        }
          /////
          DisableDebugUartRxInt();
        pISR_UART0        =(U32)IsrUartRx;       
        EnableDebugUartRxInt();
        ClrDebugUartRxIntPend();
       
        UartRxCnt                        =0;
        DownloadDataSize        =4;
        temp                                =(U8 *)DownloadAddress;
        //////
        while(UartRxCnt<4)
    {
            Sleep(100);       
    }
         
    DebugPrintf("Download Data Size = %dByte\n", DownloadDataSize);
    DebugPrintf("Downloading...\n");
    ////
       
        j                =0;
        cnt_1s        =0;
        size        =DownloadDataSize+6;
       
        while(UartRxCnt<size)
        {               
                  
                   ////显示串口下载进度和速度.
                if(time_1s!=RTC_GetSec())
                {
                        time_1s        =RTC_GetSec();
                        //GUI_Printf(16,(GUI_YSIZE>>1)+24*2,RGB565(00,00,00),GUI_BK_COLOR,FONT(ASCII8x16,HZ16x16),"Speed: %dKB/S    ", (UartRxCnt-cnt_1s)>>10);
                        cnt_1s        =UartRxCnt;
                        DebugPutch('>');
                }
                       
                ////////
               
                i=UartRxCnt;
                Sleep(50);
                if(i==UartRxCnt)
                {
                        if(j++>4)       
                        {
                                //检测到4次
                                DebugPrintf("Transmit Abort -> %d / %d\n",UartRxCnt-6,DownloadDataSize);
                                goto        ret;
                       
                        }
                }
                else
                {
                        if(j>0)
                        {
                                j--;
                        }
                }
                ////////
               
               
        }
       
        DebugPutch('\n');
        /////////////////
       
        DisableDebugUartRxInt();
        ////
       
        checksum = 0;
        buf             = (U8*)DownloadAddress;
        for(size=0; size<DownloadDataSize; size++)
        {
                checksum += buf[size];
        }
        ////
       
       
        buf         = (U8*)DownloadAddress;
        size = DownloadDataSize;
       
        if(checksum!=(buf[size]|(buf[size+1]<<8)))
        {
                DebugPrintf("CheckSum Err -> %04XH / %04XH\n",buf[size]|(buf[size+1]<<8),checksum);
                goto ret;
        }
       
        ////////
       
        DebugPuts("Download Over,Press 'Y'->Run;'N'->Exit;'P'->Program NorFlash.\n");
        ////
       
        while(1)
        {               
                char        key;
                ////
               
                Sleep(100);
                key=0;
                DebugGetch(&key);
               
                if(key)
                {
                        switch(key)
                        {
                       
                                case        'n':
                                case        'N':
                                                DebugPuts("Exit.\n");
                                                goto        ret;
                                                ////////
                                               
                                case        'y':
                                case        'Y':
                                case        '\r':
                                               
                                                DebugPuts("Run.\n");
                                                if(1)
                                                {       
                                                        void (*fun)(void) = (void (*)(void))DownloadAddress;
                                                        (*fun)();
                                                }

                                                goto        ret;
                                                ////////
                                               
                                case        'p':
                                case        'P':
                                            //WriteFlash(0,DownloadAddress,COM_downloadFileSize);
                                            goto ret;
                                                ////////
                                               
                                default:        break;
                               
                        }
                       
                }
               

                      
    }
    /////////////
   
   
ret:
        UartRxCnt=0;
        DisableDebugUartRxInt();
}

/*============================================================================*/

/*============================================================================================*/
/*============================================================================================*/

出0入0汤圆

发表于 2010-5-10 18:14:22 | 显示全部楼层
楼主:打个包给我吧,这样有些麻烦................
我的2450工程用ADS1.2编译不了,改天上传上来,帮我看看

出0入0汤圆

发表于 2010-5-11 22:44:54 | 显示全部楼层
楼主很好很强大啊,我正在搞2440和电脑主机的usb通信的程序,一直不通啊,楼主能把电脑主机通过USB读开发板的nandflash的ADS程序发给我吗?拜谢啊!!!!!邮箱49522579@qq.com,再拜一下!

出0入0汤圆

发表于 2010-6-18 01:19:51 | 显示全部楼层
楼主:能把你的2450的ads102的工程传上来吗

出0入0汤圆

发表于 2010-6-18 01:42:25 | 显示全部楼层
markmark

出0入0汤圆

发表于 2010-6-18 15:15:54 | 显示全部楼层
回复【19楼】lininglive
-----------------------------------------------------------------------

回复【楼主位】liuweiele Liuwei
-----------------------------------------------------------------------

强人  一个  顶

出0入0汤圆

发表于 2010-6-18 21:08:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-13 02:12:18 | 显示全部楼层
板太漂亮了

出0入0汤圆

 楼主| 发表于 2010-7-13 20:28:56 | 显示全部楼层

(原文件名:@O8{`@M[B8BYX7DTV)EWOP6.gif)

出0入0汤圆

发表于 2010-7-16 09:05:55 | 显示全部楼层
板子漂亮 mark先

出0入0汤圆

 楼主| 发表于 2010-9-25 15:30:02 | 显示全部楼层
最新升级版( 基于GUI操作界面 ) 源码:


#define        IDC_DISK0        0x1000
#define        IDC_DISK1        0x1001
#define        IDC_DISK2        0x1002

#define        IDC_LIST        0x2000
#define        IDC_LINK        0x2001
#define        IDC_UNLINK        0x2002

#define        IDC_GROUP_DISK        0x3000
#define        IDC_GROUP_OPS        0x3001


static        int use=0;
static        int con=0;
static        int disk=0;

static        RESULT        usb_con_proc(HWND hwnd,U32 msg,WPARAM wParam,LPARAM lParam)
{
        HDC hdc;
        HANDLE hfile;
        RECT rc,m_rc[4];
        char buf[128],*p;
        int        i,x,y;
        ////
       
        switch(msg)
        {
                case        WM_CREATE:
                                x=4;
                                y=4;
                                GetClientRect(hwnd,&rc);
                                CreateWindow("groupbox",hwnd,x,y,rc.dx-4-4,rc.dy-40,0,IDC_GROUP_DISK,"磁盘列表");
                               
                                GetClientRect(GetWindowItem(hwnd,IDC_GROUP_DISK),&rc);
                                CreateWindow("listbox",GetWindowItem(hwnd,IDC_GROUP_DISK),2,2,rc.dx-2*2,rc.dy-2*2,0,IDC_LIST,"List");
                               
                                GetClientRect(hwnd,&rc);
                                y=rc.dy-28;
                                GetMatrixRectangle(m_rc,x,y,rc.dx-4-4,24,4,1,8,2);
                                CreateWindow("button",hwnd,m_rc[0].x,m_rc[0].y,m_rc[0].dx,m_rc[0].dy,0,IDC_LINK,"连接");
                                CreateWindow("button",hwnd,m_rc[1].x,m_rc[1].y,m_rc[1].dx,m_rc[1].dy,0,IDC_UNLINK,"断开");
                                CreateWindow("button",hwnd,m_rc[2].x,m_rc[2].y,m_rc[2].dx,m_rc[2].dy,0,3,"<<");
                                CreateWindow("button",hwnd,m_rc[3].x,m_rc[3].y,m_rc[3].dx,m_rc[3].dy,0,4,">>");
                       
                                i=0;
                               
                                for(i=0;i<_DRIVES;i++)
                                {
                                        if(GetDriveName(i))
                                        {
                                                StrPrintf(buf,"%d: %s - %dMB",i,GetDriveName(i),(GetDriveSectorCount(i)*GetDriveSectorSize(i))>>20);               
                                                SendMessage(GetWindowItem(GetWindowItem(hwnd,IDC_GROUP_DISK),IDC_LIST),LB_ADDSTRING,i,(LPARAM)buf);
                                        }
                                }
                                                               
                                //SetTimer(hwnd,0x3000,500,0);

                                break;
                                ////
               
                case        WM_COMMAND:
                                {
                                        U16        code,id;
                                        ////
                                       
                                        code        =HIWORD(wParam);
                                        id                =LOWORD(wParam);
                                        switch(id)
                                        {
                                       
                                                case        IDC_LINK:
                                                                {
                                                                       
                                                                        if(code==BN_UP)       
                                                                        {
                                                                                int cur;
                                                                               
                                                                                if(con==0)
                                                                                {
                                                                                        cur        =SendMessage(GetWindowItem(GetWindowItem(hwnd,IDC_GROUP_DISK),IDC_LIST),LB_GETCURSEL,0,0);
                                                                                        StrPrintf(buf,"是否要连接到: %s ?",GetDriveName(cur));
                                                                                        if(MessageBox(hwnd,buf,"信息",MB_YESNO|MB_ICONQUESTION)==IDYES)
                                                                                        {
                                                                                                disk=cur;
                                                                                                if(USB_MassStorageEntry(disk))
                                                                                                {
                                                                                                        con=1;
                                                                                                        StrPrintf(buf,"USB连接 [已连接到:%s]",GetDriveName(disk));
                                                                                                        SetWindowText(hwnd,buf);
                                                                                                }
                                                                                                else
                                                                                                {
                                                                                                        con=0;
                                                                                                       
                                                                                                        if(MessageBox(hwnd,"驱动器错误","出错信息",MB_OK|MB_ICONERROR)==IDOK)
                                                                                                        {
                                                                                                                SendMessage(hwnd,WM_CLOSE,0,0);
                                                                                                        }
                                                                                               
                                                                                                }
                                                                                                InvalidateRect(hwnd,0,0);
                                                                                        }
                                                                                }
                                                                                else
                                                                                {
                                                                                        MessageBox(hwnd,"USB已连接,如果需要连接到其它磁盘,请先断开当前连接.","信息",MB_OK|MB_ICONERROR);
                                                                                }
                                                                        }
                                                                       
                                                                       
                                                                }
                                                                break;
                                                                ////////
                                                               
                                                case        IDC_UNLINK:
                                                                {
                                                                       
                                                                        if(code==BN_UP)       
                                                                        {
                                                                                if(con==1)
                                                                                {
                                                                                        StrPrintf(buf,"确定要断开 %s 连接吗?",GetDriveName(disk));
                                                                                        if(MessageBox(hwnd,buf,"信息",MB_YESNO|MB_ICONQUESTION)==IDYES)
                                                                                        {
                                                                                                USB_MassStorageExit(disk);
                                                                                                con=0;
                                                                                                StrPrintf(buf,"USB连接 [已断开]");
                                                                                                SetWindowText(hwnd,buf);
               
                                                                                                InvalidateRect(hwnd,0,0);
                                                                                        }
                                                                                }
                                                                                else
                                                                                {
                                                                                        MessageBox(hwnd,"当前没有连接!","信息",MB_OK|MB_ICONWARNING);
                                                                                }
                                                                        }
                                                                       
                                                                }
                                                                break;
                                                                ////////
                                               
                                        }
                               
                                }
                                ////
                               
                case        WM_PAINT:
               
                                hdc=BeginPaint(hwnd);
                                                               
                                EndPaint(hwnd,hdc);
                                break;
                                ////
                               
                case        WM_CLOSE:
                                if(con==1)
                                {
                                        USB_MassStorageExit(disk);
                                        con=0;

                                }
                               
                                //KillTimer(hwnd,0x3000);
                                DestroyWindow(hwnd);
                                break;
                                ////
                default:
                                return        DefWindowProc(hwnd,msg,wParam,lParam);
       
        }
       
        return        0;
}

/*============================================================================*/

int        USBConnect(void *p)
{
        HWND hwnd;
        MSG msg;
        WNDCLASS wcls;
        ////
       
       
        if(use==1)        return;
        use=1;
       
        wcls.Name                ="USB连接";
        wcls.Style                =WS_CAPTION|WS_BORDER_DUAL|WS_VISIBLE;
        wcls.ExStyle        =0;
        wcls.ExData                =0;
        wcls.hCursor        =0;
        wcls.BkColor        =RGB(128,128,128);
        wcls.Proc                =usb_con_proc;
       
        hwnd        =CreateMainWindow(&wcls,20,ScreenHeight()-320,200,160);       
               
                                                               
        ShowWindow(hwnd,SW_SHOW);
       
        while(1)
        {
                if(PeekMessage(&msg,hwnd,PM_REMOVE))
                {
                        if(msg.message==WM_QUIT)        break;
                        TranslateMessage(&msg);
                        DispatchMessage(&msg);
                }
               
                if(con==1)
                {
                        DiskOps();
                }
               
        }
       
        use=0;
       
}

/*=========================================================================================*/

出0入0汤圆

 楼主| 发表于 2010-9-25 15:34:25 | 显示全部楼层
基于GUI的操作界面( S3C2450 + 7寸TFT(800x480) ):



(原文件名:P1000720.JPG)


(原文件名:P1000721.JPG)


(原文件名:P1000722.JPG)


(原文件名:P1000723.JPG)


(原文件名:P1000724.JPG)


(原文件名:P1000725.JPG)


(原文件名:P1000726.JPG)

出0入0汤圆

发表于 2010-9-25 17:06:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-3-16 11:44:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-10 19:49:17 | 显示全部楼层
回复【楼主位】liuweiele Liuwei
-----------------------------------------------------------------------

有源码的都是好贴

出0入0汤圆

发表于 2017-11-30 14:59:44 | 显示全部楼层
强呀,不得不顶
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 06:07

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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