下面是我师兄写的驱动程序的摘录(指摘了与读取相关的部分)。
下面是针对RAM的读写函数:
void write_ram(U16 addr,U16 data)
{       
rGPECON = 0x55555555;                         //data output
rGPBDAT = addr;                               //transfer addr
rGPEDAT = data;                               //transfer data
rGPFDAT&= 0xFFFFFFFB;                         //ce=0
printk("write addr=%X,data=%X\n",addr,data);  //for debug
rGPFDAT&= 0xFFFFFFFE;                         //r/w=0
rGPFDAT|= 0x1;                                //r/w=/ce=1
rGPFDAT|= 0x00000004;                         //r/w=/ce=1
}
U16 read_ram(U16 addr)
{
U16 data;
rGPECON = 0x0;                                //input 
rGPBDAT = addr;                               //transfer addr
//a condition ?
rGPFDAT&= 0xFFFFFFFB;                         //ce=0
rGPFDAT&= 0xFFFFFFFD;                         //oe=0
data    = rGPEDAT;                            //transfer data
rGPFDAT|= 0x4;                                //ce=1
rGPFDAT|= 0x2;                                //oe=1
printk("read addr=%X,data=%X\n",addr,data);   //for debug
return data;
}
下面是对上面的函数的linux包装,使其适应linux操作系统(一定要有,再深的我也不懂):
//Read to device
static ssize_t ram_rd(struct file *file, char *buf, size_t count, loff_t *offset)
{       
U16 i;
U16 raddr=0,data=0;
dbuf = kmalloc(count*sizeof(U8) , GFP_KERNEL);     //requsest mem in kernel
copy_from_user(dbuf,buf,2);                       //transfer data form user to kernel
raddr=(dbuf[1]<<8)+dbuf[0];                       //transfer addr
for(i=2;i<count;i=i+2)                            //transfer data
  {
   data=read_ram(raddr);
   dbuf=data;
   dbuf[i+1]=data>>8;
   raddr++;
   }
copy_to_user(buf,dbuf,count);                    //transfer data form kernel to user
kfree(dbuf);
return 0;
}
//Write to device
static ssize_t ram_wr(struct file *file,const char *buf, size_t count, loff_t *offset)
{
U16 i=0;
U16 raddr=0,data=0;
dbuf = kmalloc(count*sizeof(U8) , GFP_KERNEL);    //requsest mem in kernel
copy_from_user(dbuf,buf,count);                   //transfer data form user to kernel
raddr=(dbuf[1]<<8)+dbuf[0];                       //transfer addr
for(i=2;i<count;i=i+2)                            //transfer data
  { 
  data=(dbuf[i+1]<<8)+dbuf;
  write_ram(raddr,data);
  raddr++;
  }       
kfree(dbuf);
return 0;
}
下面是注册驱动程序时用到的一个结构,它的作用是定义该驱动程序可以对RAM进行哪些操作,其中就有read和write(它们与ram_rd、ram_wr),也就是要在QT中用的。
static struct file_operations ram_fops = 
{
owner:              THIS_MODULE,
llseek:              no_llseek,
read:              ram_rd,
write:              ram_wr,
ioctl:              ram_ioctl,
open:              ram_open,
release:       ram_close,
};
下面是在QT中的应用:
这是自定义的函数,"/dev/ram"中的ram是驱动文件的名字,char数组的赋值是针对我的程序的,看不懂可略过。
void First::send()
{ 
   
    bool ok;
    char wr[4];
    char rd[4];
    QString str_temp;
    
    str_temp=data_16b.mid( 0, 2 );
    wr[0]=str_temp.toUInt(&ok,16);
    str_temp=data_16b.mid( 2, 2 );
    wr[1]=str_temp.toUInt(&ok,16);
    str_temp=data_16b.mid( 4, 2 );
    wr[2]=str_temp.toUInt(&ok,16);
    str_temp=data_16b.mid( 6, 2 );
    wr[3]=str_temp.toUInt(&ok,16);
    rd[0]=wr[0];
    rd[1]=wr[1];
    int fd;
    fd = open("/dev/ram",O_RDWR);
 
    write(fd,wr,4);
    read(fd,rd,4);
    
    if(rd[2]==wr[2])
    Hz->setEnabled(TRUE);
    else
    Hz->setEnabled(FALSE);
 }
我能帮的就这么多,我也是初学者,再深的我也不太懂,希望能帮到你。