下面是我师兄写的驱动程序的摘录(指摘了与读取相关的部分)。
下面是针对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);
}
我能帮的就这么多,我也是初学者,再深的我也不太懂,希望能帮到你。