?? i2c_final_ok_080804_pass1sttest.c.bak
字號:
m=0;
break;
}
m++;
} IICCON = ConSet; //Resumes IIC operation.
m=0;
printk("Address test pass!\n");
readdataF=1;
iicStatus = 0;
for(j=1;j<=iicRDTransNum;j++)
{
*page = IICDS;
IICCON = ConSet; //Resumes IIC operation.
while(iicStatus!=1)
{
if(k==200000)
{
k=0;
printk("out of time2!! \n");
break;
}
k++;
}
k=0;
//IICCON = ConSet; //Resumes IIC operation.
for(i=0;i<10;i++);
page++;
iicStatus = 0;
printk("Read one byte is finished!\n");
} IICSTAT=IICSTAT&0xef;
IICCON = ConSet; //Resumes IIC operation.
Delay(1); //Wait until stop condtion is in effect.
//Reading operation is completed.
readdataF=0; //Clear read data flag
page-= iicRDTransNum;ReleaseRXBus();
for(i=1;i<=iicRDTransNum;i++)
{
printk(" %d",*page);
page++;
}
page-= iicRDTransNum;
if(!access_ok(VERIFY_READ,(void *)buf,count))
{
return -EFAULT;
}
copy_to_user(buf,page,count);
return 0;
}
/*****************************Write system call for i2c_test*************************************************************/
static int i2c_test_write(struct file *filp, const char *buf,size_t count,loff_t *ppos)
{
int i,j,n; __u32 k,m; k=0; m=0; n=0;
iicStatus = 0;
iicDataCount =1;
iicMode = POLLACK;
i2c_Initialization(); //Initialization for i2c bus operation
if(!access_ok(VERIFY_READ,(void *)buf,count))
{
return -EFAULT;
}
copy_from_user(page, buf, count); IICSTAT |=0xc0; //Set MasTx Mode aa: IICDS = slaveAddr; //0xa0
IICSTAT = 0xf0; //MasTx,Start
while(iicStatus!=1) {
if(m==400000) { m=0; if(n==0) { n=1; printk("out of time1!! Retry~~\n"); goto aa; } else break; } m++;
} m=0;
printk("Address test pass!\n");
writedataF=1;
iicStatus = 0;
for(j=1;j<=iicWRTransNum;j++)
{
IICDS = *page; IICCON=0xef; //Resumes IIC operation.
while(iicStatus!=1)
{ if(k==200000) { k=0; printk("out of time2!! \n"); break; } k++;
} k=0;
//IICCON=ConSet; //Resumes IIC operation.
for(i=0;i<10;i++);
page++;
iicStatus = 0;
printk("Write one byte is finished!\n");
} IICSTAT=0xd0; //Stop MasTx condition
IICCON = ConSet; //Resumes IIC operation.
Delay(1); //Wait until stop condtion is in effect.
//Writing operation is completed.
writedataF=0; ReleaseTXBus();
page-= iicWRTransNum; //*Page points to his original place
for(i=1;i<=iicWRTransNum;i++)
{
printk(" %d",*page);
page++;
}
page-=iicWRTransNum;
printk("\n");
return 0;
}
/*******************************ioctl system call for i2c_test********************************************/
static int i2c_test_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)
{
switch(cmd)
{
case 0:
slaveAddr = arg;//set the slave address to driver
IICDS = slaveAddr;
printk("You've set the slave device's address: %d\n",IICDS);
break;
case 1:
iicRDTransNum = arg; //Set read operate data number
printk("You've set the read data number:%d\n",iicRDTransNum);
break;
case 2:
iicWRTransNum = arg; //Set write operate data number
printk("You've set the write data number:%d\n",iicWRTransNum);
break;
case 4:
if(arg==0)
{
SCALE_Base=HIGHSCALE;
printk("You've set the 512 Prescale for IICCLK~");
}
else if(arg==1)
{
SCALE_Base=LOWSCALE;
printk("You've set the 16 Prescale for IICCLK~");
}
else
{
printk("You've set the wrong parament!");
return -ENOSYS;
}
break;
default:
return -ENOSYS;
};
return 0;
}
/********************************fops for i2c_test***********************************************************************/
static struct file_operations i2c_test_fops =
{
owner: THIS_MODULE,
read: i2c_test_read,
write: i2c_test_write,
open: IIC_test_open,
release: IIC_test_release,
ioctl: i2c_test_ioctl,
};
/********************************Device registed mount & unregisted mount***********************/
static int tsMajor;
static devfs_handle_t devfs_handle;
static int __init i2c_test_init(void)
{
int ret;
ret = register_chrdev(0, DEVICE_NAME, &i2c_test_fops);
if (ret < 0)
{
printk(DEVICE_NAME " can't get major number\n");
return ret;
}
tsMajor = ret;
devfs_handle = devfs_register(NULL,DEVICE_NAME,DEVFS_FL_DEFAULT,0,0,S_IFCHR|S_IRUSR|S_IWUSR,&i2c_test_fops,NULL);
page=(unsigned int*)__get_free_page(GFP_USER); //char* edited
/******************Default set,if not case 1 & case 2 happen***************/ SCALE_Base=LOWSCALE; iicRDTransNum=8; iicWRTransNum=8;
/**************************************************************************/
return 0;
}
static void __exit i2c_test_exit(void)
{
free_irq(IRQ_IIC,NULL);
kfree(page);
devfs_unregister(devfs_handle);
unregister_chrdev(tsMajor,DEVICE_NAME);
}
module_init(i2c_test_init);
module_exit(i2c_test_exit);
MODULE_AUTHOR("dongleispark AT gmail.com");
MODULE_DESCRIPTION("Study");
MODULE_SUPPORTED_DEVICE(DEVICE);
MODULE_LICENSE("GPL");
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -