QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2969|回复: 1

Linux下读写usb设备的问题

[复制链接]
发表于 2008-7-15 10:37:46 | 显示全部楼层 |阅读模式
急求高手帮忙解决!!!
我写了一个小程序,功能是在Linux(fedora 7)操作系统下,通过USB读卡器,读、写SD卡某个sector上的512字节的数据,如果能正确写入,会有相应的响应数据,程序如下:

#define _GNU_SOURCE
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
        int fd,num,loop,tt,i;
        unsigned char writeBuf[512] = {0};
        int offset = 0x50000;
        
        //打开
        fd = open("/dev/sda1",O_RDWR | O_DIRECT);
        //fd = open("/media/SD CARD/system.txt",O_RDWR);

        if(fd==-1)
        {
                printf("can't open the device by device mode !\n");
                return -1;
        }

        //设置
        //fcntl(fd,F_SETFL,O_DIRECT);
      

        //写入数据内容
        memcpy(writeBuf,"\x55\xAA\xAA\x55",4);
        
        //写
        tt = lseek(fd,offset,SEEK_SET);
        printf("\n Write lseek %#x\n",tt);
        num = write(fd,writeBuf,512);
        
        if(num==512)
        {
                printf("\n write success!\n");
                num = 0;
        }
        if(num==-1)
        {
                printf("write failed!\n");
                close(fd);
                return -1;
        }
        
        //同步,等待
        sync();
        sleep(1);
        memset(writeBuf,0x00,512);

        //读
        tt = lseek(fd,offset,SEEK_SET);
        printf("\n Read lseek %#x \n",tt);
        num = read(fd,writeBuf,512);
        
        if(num==512)
               {
                     printf("\n read   success!\n");
                }
               else
              {
                      printf("read  failed!\n");
                      close(fd);
                       return -1;
               }
        
        //打印响应数据
        for(i = 0; i < 512; i++)
        {
                        if((i % 32) == 0)
                            printf("\r\n");
                                printf("%3x ", writeBuf);
                                 if(i == 512)
                        printf("\r\n\n");  
        }

        close(fd);

        return 0;
}


目前问题是这样的:如果以O_RDWR | O_DIRECT方式打开设备,则无法写入。如果只以O_RDWR 方式打开,写和读都成功,但是貌似数据没有真正写入,因为读出来的数据和写入的是一样的,我的硬件没问题,肯定应该有响应,有可能是写到缓存里了,读也是从缓存读的。请大家帮忙出谋划策,小弟万分感谢!!!
 楼主| 发表于 2008-7-15 10:42:03 | 显示全部楼层
此外,在window下,利用DeviceIoControl函数可以通过usb读卡器向SD的0x280(0x280是sector address,disk address是0x280*0x200=0x50000)写入数据,也能得到正确的响应。不知道linux利用llseek函数,其中的0x5000是否就是windows下0x280的sector地址的实际disk address???
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-4-20 03:46 , Processed in 0.104993 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

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