⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i2c_final_ok_080804_pass1sttest.c.bak

📁 应用于S3C2440芯片的I2C设备驱动程序
💻 BAK
📖 第 1 页 / 共 2 页
字号:
                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 + -