<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<title></title>
<meta content="MSHTML 6.00.2900.3698" name="GENERATOR">
</head>
<body>
<!-- Converted from text/plain format -->
<p><font size="2">Hi Scott,<br>
<br>
When I call if  i2c_master_send(&ds75->i2c_client,buffer,2) it crashes. In module initialization I don't see any errors. Below are kernel messages. Could you please let me know what may be the reason for this crash.<br>
<br>
-----------Logs---------<br>
Loading Temperature Sensor Interface module (temp_if.ko)<br>
<font color="#ff0000"><font color="#0000ff">ds75_init<br>
DS75_DRIVER : Open<br>
DS75_DRIVER : Device Open Successful!<br>
DS75_DRIVER  : ioctl TEMP_READ cmd 1<br>
 ds75_temp_read calling i2c_master_send<br>
In i2c_master_send enter-------<br>
</font>Unable to handle kernel paging request for data at address 0x00000010<br>
</font>Faulting instruction address: 0xc01b06a4<br>
Oops: Kernel access of bad area, sig: 11 [#1]<br>
<br>
Modules linked in: temp_if gpio_if<br>
NIP: C01B06A4 LR: C01B06A0 CTR: C019BC90<br>
REGS: c309bdc0 TRAP: 0300   Not tainted  (2.6.21.7-hrt1-cfs-v22-grsec-WR2.0bl_cgl)<br>
MSR: 00009032 <EE,ME,IR,DR>  CR: 44004822  XER: 00000000<br>
DAR: 00000010, DSISR: 20000000<br>
TASK = c306f810[145] 'epn412' THREAD: c309a000<br>
GPR00: 00007D00 C309BE70 C306F810 C02A0000 00000001 00000001 00000000 FDFBD0A0<br>
GPR08: 003DE8A0 A827A936 00003F78 C02EAE88 00000001 1011C7C0 03EFD000 FFFFFFFF<br>
GPR16: 00000001 00000000 007FFC00 37942FA8 1012EAC0 1001E530 37942FB4 00000003<br>
GPR24: 37942FB4 00000000 003D0F00 C309BEA8 FFFFFFF7 00000008 C309BEA8 00000002<br>
Call Trace:<br>
[C309BE70] [C01B0698]  (unreliable)<br>
[C309BEA0] [C50B71DC]<br>
[C309BED0] [C007A0D0]<br>
[C309BEE0] [C007A158]<br>
[C309BF10] [C007A4EC]<br>
[C309BF40] [C000E780]<br>
--- Exception: c01Instruction dump:<br>
7c0802a6 bf61001c 7c7d1b78 3c60c02a 386313b4 7cbf2b78 90010034 7c9b2378<br>
4be6bc79 386007d0 4be5ac6d 3c60c02a <839d0008> 386313d8 4be6bc61 a01d0004<br>
<br>
<br>
<br>
<br>
<strong>Below is the driver code.<br>
-------------------------<br>
</strong><br>
#include "temp_if.h"<br>
#include <asm-powerpc/uaccess.h><br>
#include <linux/i2c.h><br>
//#include <asm/arch/platform.h><br>
<br>
<br>
#define I2C_DEBUG<br>
<br>
#ifdef      I2C_DEBUG<br>
#define     I2C_DBG1(x)                 printk(KERN_WARNING x)<br>
#define     I2C_DBG2(x,y)               printk(KERN_WARNING x,y)<br>
#define     I2C_DBG3(x,y,z)             printk(KERN_WARNING x,y,z)<br>
#define     I2C_DBG4(w,x,y,z)           printk(KERN_WARNING w,x,y,z)<br>
#else<br>
#define I2C_DBG1(x)                <br>
#define I2C_DBG2(x,y)<br>
#define I2C_DBG3(x,y,z)<br>
#define I2C_DBG4(w,x,y,z)<br>
#endif<br>
<br>
/* Function Prototype */<br>
static int ds75_open(struct inode *inode, struct file *filp);<br>
static int ds75_iotcl(struct inode *inode, struct file *flip, unsigned int cmd, unsigned long arg);<br>
static int ds75_release(struct inode *inode, struct file *flip);<br>
int ds75_attach_client(struct ds75_data * ds75, struct i2c_adapter *adapter);<br>
<br>
int ds75_attach_adapter(struct i2c_adapter *adapter);<br>
int ds75_detach_client(struct i2c_client *client);<br>
<br>
<br>
<br>
<br>
/* Structure */<br>
static struct file_operations tmpsensor_fops =<br>
{<br>
        ioctl:          ds75_iotcl,<br>
        open:           ds75_open,<br>
        release:        ds75_release,  <br>
<br>
};<br>
<br>
static struct i2c_driver ds75_driver = {<br>
        .driver = {<br>
                .name   = "DS75",<br>
        },<br>
        .attach_adapter = ds75_attach_adapter,<br>
        .detach_client  = ds75_detach_client,<br>
};<br>
<br>
/* Global Variable */<br>
static int s_nI2CMajor = 0;<br>
static int s_bI2CDevOpen = 0;<br>
static int s_nUseCnt = 0;<br>
struct ds75_data *ds75;<br>
<br>
<br>
static int ds75_open(struct inode *inode, struct file *flip)<br>
{<br>
  I2C_DBG1( "DS75_DRIVER : Open\n");<br>
  if(s_bI2CDevOpen == 0)<br>
    {<br>
      I2C_DBG1("DS75_DRIVER : Device Open Successful!\n");<br>
      s_bI2CDevOpen = 1;<br>
      s_nUseCnt++;<br>
     <br>
    }<br>
  else<br>
    {<br>
      I2C_DBG1("DS75_DRIVER : Device Already Opened Successfully!\n");<br>
      s_bI2CDevOpen = 1;<br>
      s_nUseCnt++;<br>
    }<br>
  return 0;<br>
}<br>
<br>
<br>
static int ds75_release(struct inode *inode, struct file *flip)<br>
{<br>
  I2C_DBG1 (KERN_INFO "Entering ds75_release\n" );<br>
  if(s_bI2CDevOpen)<br>
    {<br>
      if( s_nUseCnt <= 0 )<br>
        {<br>
          I2C_DBG1("DS75_DRIVER  : i2c driver can't be released!\n");<br>
          return -EIO;<br>
        }<br>
      else<br>
        {<br>
          I2C_DBG1("DS75_DRIVER  : Release Successful!\n");<br>
          s_nUseCnt--;<br>
          if( s_nUseCnt == 0 )<br>
            {<br>
              s_bI2CDevOpen = 0;<br>
              I2C_DBG1("DS75_DRIVER  : I2C Driver is Closed!\n");<br>
                }<br>
        }<br>
      return 0;<br>
    }<br>
  else<br>
    {<br>
      I2C_DBG1("DS75_DRIVER  : Release Fail! (Device is Not Open)\n");<br>
      return -EIO;<br>
    }<br>
}<br>
<br>
/*<br>
 This function will read the Temperature from the device and copies to user space<br>
*/<br>
static int ds75_temp_read(struct ds75_msg_t *pData)<br>
{<br>
     //unsigned char buffer[4];<br>
     signed char buffer[4];<br>
     int ret;<br>
     buffer[0]=0;  /* Writing 0 in to Pointer register. --> Temprature read register */<br>
     if ((ret = i2c_master_send(&ds75->i2c_client,buffer,2)) !=2)<br>
     {<br>
         I2C_DBG2("DS75_DRIVER  : Error writing to I2C ret = %d\n",ret);<br>
                     return -1;<br>
     }<br>
    <br>
     /* reading from the temperature read register */<br>
     if (i2c_master_recv(&ds75->i2c_client,buffer,2)!= 2)<br>
     {<br>
         I2C_DBG1("DS75_DRIVER  : Error reading from I2C\n");<br>
                     return -1;<br>
     }<br>
    <br>
     //I2C_DBG3("DS75_DRIVER: data[0] = %d, data[1] = %d \n",buffer[0],buffer[1]);<br>
        //I2C_DBG3("DS75_DRIVER: data[0] = %d, data[1] = %d \n",buffer[0],buffer[1]);<br>
    <br>
     /* Copy User Memory Area */<br>
           if(copy_to_user(pData->ReadData,buffer, 2 ) != 0)<br>
           {<br>
              I2C_DBG1("DS75_DRIVER  : error in copying to user space");<br>
              return -1;<br>
           }<br>
<br>
     return 0;  /* Success */<br>
    <br>
}<br>
<br>
<br>
static int ds75_iotcl(struct inode *inode, struct file *flip, unsigned int cmd, unsigned long arg)<br>
{<br>
        int nRetVal = 0;<br>
       <br>
        if( ((struct ds75_msg_t *)arg) == NULL ){<br>
                I2C_DBG1("DS75_DRIVER  : ioctl Message Buff must not be NULL\n");<br>
                return -EFAULT;<br>
        }<br>
<br>
        switch(cmd){<br>
                case TEMP_READ:<br>
                        I2C_DBG2("DS75_DRIVER  : ioctl TEMP_READ cmd %d\n",cmd);<br>
                        nRetVal = ds75_temp_read((struct ds75_msg_t *) arg);<br>
                        break;<br>
     <br>
                default:<br>
                        /* Error! */<br>
                        I2C_DBG1("DS75_DRIVER  : Command  not implemented\n");<br>
                        nRetVal = -EIO;<br>
                        break;<br>
        }<br>
        return nRetVal;<br>
}<br>
<br>
<br>
/*<br>
 *  i2c_attach_client - tries to detect and initialize slics<br>
*/<br>
int ds75_attach_client(struct ds75_data * ds75, struct i2c_adapter *adapter)<br>
{<br>
        struct i2c_client * client;<br>
<br>
        /* register i2c client */<br>
        client = &ds75->i2c_client;<br>
        client->adapter = adapter;<br>
        client->driver = &ds75_driver;<br>
//      client->flags = I2C_CLIENT_ALLOW_USE;<br>
  client->addr = DS75_ADDR;       <br>
  strlcpy(client->name, "DS75", I2C_NAME_SIZE);<br>
        i2c_set_clientdata(client, ds75);<br>
 <br>
        if (i2c_attach_client(client))<br>
     return -1;<br>
 <br>
        printk (KERN_INFO DS75_DRIVER_NAME ": I2C client attached\n");<br>
        return 0;<br>
}<br>
<br>
/*<br>
 *  i2c_attach_adapter - initializes the maxim driver<br>
*/<br>
int ds75_attach_adapter(struct i2c_adapter *adapter)<br>
{<br>
        /* allocate maxim_data structure */<br>
        ds75 = kmalloc(sizeof (struct ds75_data), GFP_KERNEL);<br>
        if (ds75 == NULL)<br>
        {<br>
           printk (KERN_ERR "Unable to allocate memory for ds75 temp sensor driver\n");<br>
           goto err0;<br>
        }<br>
        memset(ds75, 0, sizeof(struct ds75_data));<br>
<br>
        /* Attach Spi Client */<br>
        if (ds75_attach_client(ds75, adapter) != 0)<br>
        {<br>
           printk (KERN_ERR "No ds75 device detected\n");<br>
           goto err1;<br>
        }<br>
<br>
        return 0;<br>
<br>
err1:<br>
        kfree(ds75);<br>
err0:<br>
        return -1;<br>
}<br>
<br>
/*<br>
 *  i2c_detach_client - cleans up the maxim driver<br>
*/<br>
int ds75_detach_client(struct i2c_client *client)<br>
{<br>
        struct ds75_data *ds75 = i2c_get_clientdata(client);<br>
<br>
        if (ds75->owned_irq)<br>
        {<br>
                free_irq(ds75->irq, ds75);<br>
                ds75->owned_irq = 0;<br>
               <br>
        }<br>
<br>
        i2c_detach_client(&ds75->i2c_client);<br>
   <br>
        kfree (ds75);      // Free the kernel memory */<br>
<br>
        return 0;<br>
}<br>
<br>
<br>
<br>
<br>
/*<br>
 * Temperature sensor DS75 init -<br>
 *<br>
 */<br>
int __init ds75_init(void)<br>
{<br>
        int rc;<br>
        rc = i2c_add_driver(&ds75_driver);<br>
        if (rc)<br>
        {<br>
                printk (KERN_ERR DS75_DRIVER_NAME ": unable to add driver\n");<br>
                return rc;<br>
        }<br>
<br>
        rc = register_chrdev (DS75_DEVICE_MAJOR_NUM, DS75_DRIVER_NAME, &tmpsensor_fops);<br>
        if (rc)<br>
        {<br>
                printk (KERN_ERR DS75_DRIVER_NAME ": unable to register char device\n");<br>
                return rc;<br>
        }<br>
<br>
        return 0;<br>
}<br>
<br>
/**<br>
 * maxim _exit -<br>
 *<br>
 *<br>
 */<br>
void __exit ds75_exit(void)<br>
{<br>
        unregister_chrdev (DS75_DEVICE_MAJOR_NUM, DS75_DRIVER_NAME);<br>
<br>
        i2c_del_driver(&ds75_driver);<br>
}<br>
<br>
MODULE_AUTHOR("xxxx");<br>
MODULE_DESCRIPTION("DS75 I2C driver");<br>
MODULE_LICENSE("GPL");<br>
<br>
module_init(ds75_init);<br>
module_exit(ds75_exit);<br>
<br>
<br>
Regards,<br>
Smitha</font> </p>
<P><strong><span style='font-size:10.0pt;font-family:
"Palatino Linotype","serif";color:green'> Please do not print this email unless it is absolutely necessary. </span></strong><span style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>


<p> The information contained in this electronic message and any attachments to this message are intended for the exclusive use of the addressee(s) and may contain proprietary, confidential or privileged information. If you are not the intended recipient, you should not disseminate, distribute or copy this e-mail. Please notify the sender immediately and destroy all copies of this message and any attachments. </p>

<p>WARNING: Computer viruses can be transmitted via email. The recipient should check this email and any attachments for the presence of viruses. The company accepts no liability for any damage caused by any virus transmitted by this email. </p>
<p>
www.wipro.com
</p>
</body>
</html>