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

📄 eeprom_iic.c

📁 MIPS下的boottloader yamon 的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
INT32 EEPROM_IIC_install( void )
{
	/* pre-initialize local variables and install device services */
	return( IO_install( SYS_MAJOR_EEPROM_IIC, /* major device number */
         (t_io_service) EEPROM_IIC_init,             /* 'init'  service     */
                        NULL,                 /* 'open'  service  na */
                        NULL,                 /* 'close' service  na */
         (t_io_service) EEPROM_IIC_read,             /* 'read'  service     */
         (t_io_service) EEPROM_IIC_write,            /* 'write' service     */
                        NULL  ) ) ;           /* 'ctrl'  service  na */
}



/************************************************************************
 *      Implementation : Static functions
 ************************************************************************/

/************************************************************************
 *
 *                          EEPROM_IIC_init
 *  Description :
 *  -------------
 *  This service initializes the EEPROM driver.
 *  
 *
 *  Parameters :
 *  ------------
 *
 *  'major',     IN,    major device number
 *  'minor',     IN,    not used
 *  'p_param',   INOUT, not used
 *
 *
 *  Return values :
 *  ---------------
 *
 *  'OK'(=0)
 *
 *
 *
 ************************************************************************/
static
INT32 EEPROM_IIC_init(
          UINT32 major,          /* IN: major device number             */
          UINT32 minor,          /* IN: minor device number             */
          void   *p_param )      /* INOUT: device parameter block       */
{

    /* initialize EEPROM profile for NM24C09 */
    device[EEPROM_MINOR_NM24C09].size     = EEPROM_NM24C09_SIZE ;
    device[EEPROM_MINOR_NM24C09].pagesize = EEPROM_NM24C09_PAGESIZE ;
    device[EEPROM_MINOR_NM24C09].mode     = EEPROM_READ_WRITE_MODE ;

    SYSCON_read( SYSCON_BOARD_EEPROM_ADDR,
		 &device[EEPROM_MINOR_NM24C09].iicadr,
		 sizeof(UINT8) );

    /* initialize EEPROM profile for SPD PC-SDRAM */
    device[EEPROM_MINOR_SPD000].size      = EEPROM_SPD_SIZE ;
    device[EEPROM_MINOR_SPD000].pagesize  = EEPROM_SPD_PAGESIZE ;
    device[EEPROM_MINOR_SPD000].mode      = EEPROM_READ_ONLY_MODE ;

    SYSCON_read( SYSCON_BOARD_EEPROM_SPD_ADDR,
		 &device[EEPROM_MINOR_SPD000].iicadr,
		 sizeof(UINT8) );

    return( OK ) ;
}

/************************************************************************
 *
 *                          EEPROM_IIC_read
 *  Description :
 *  -------------
 *  This service reads data from a specified location of a specified
 *  EEPROM device.
 *
 *  Parameters :
 *  ------------
 *
 *  'major',     IN,    major device number
 *  'minor',     IN,    minor device number for multi device drivers
 *  'p_param',   INOUT, variable of type, t_EEPROM_read_descriptor.
 *
 *
 *  Return values :
 *  ---------------
 *
 *  'OK'(=0)
 *
 *
 ************************************************************************/
static
INT32 EEPROM_IIC_read(
          UINT32 major,          /* IN: major device number             */
          UINT32 minor,          /* IN: minor device number             */
          t_EEPROM_read_descriptor *p_param )   /* INOUT: read buffer   */
{
    int    rcode ;
    UINT32 offset, left ;
    UINT8  startpage, endpage, iicadr, readcount ;
    UINT8  *user_buffer ;
    UINT8  roffset ;
    t_IIC_write_read_descriptor iic_read ;
    t_IIC_ctrl_descriptor       iic_ctrl ;

    /* init ctrl descriptors */
    iic_ctrl.command = IIC_CTRL_WRITE_READ ;
    iic_ctrl.data    = &iic_read ;
    iic_read.write_length = 1 ;
    iic_read.write_buffer = &roffset  ;

    /* check minor device number */
    if (minor >= EEPROM_MINOR_DEVICE_COUNT)
    {
        return(ERROR_EEPROM_UNKNOWN_DEVICE) ;
    }

    /* check read request */
    if ( (p_param->offset + p_param->length) > device[minor].size )
    {
        return(ERROR_EEPROM_PARAM_OUT_OF_SPACE) ;
    }

    offset      = p_param->offset ;
    left        = p_param->length ;
    user_buffer = p_param->buffer ;
    while (left > 0)
    {
      startpage = offset / device[minor].pagesize ;
      endpage   = (offset + left) / device[minor].pagesize ;

      /* 1: calculate IIC slave address */
      iicadr = device[minor].iicadr + startpage ;

      /* 2: calculate bytes to read */
      if (startpage != endpage)
      {
          readcount = device[minor].pagesize - 
                      offset % device[minor].pagesize ;
      }
      else
      {
          readcount = left ;
      }

      /* 3: read 'readcount' */
      iic_ctrl.IICaddress  = iicadr ;
      roffset              = offset % device[minor].pagesize ;
      iic_read.read_length = readcount ;
      iic_read.read_buffer = user_buffer ;
      rcode = IO_ctrl( SYS_MAJOR_IIC, 0, &iic_ctrl ) ;
      if ( rcode != OK)
      {
          return(rcode) ;
      }

      /* 4: update context */
      left        = left - readcount ;
      offset      = offset + readcount ;
      user_buffer = user_buffer + readcount ;
    }

    return( OK ) ;
}

/************************************************************************
 *
 *                          EEPROM_IIC_write
 *  Description :
 *  -------------
 *  This service writes data into a specified location of a specified
 *  EEPROM device.
 *
 *
 *  Parameters :
 *  ------------
 *
 *  'major',     IN,    major device number
 *  'minor',     IN,    minor device number for multi device drivers
 *  'p_param',   INOUT, variable of type, t_EEPROM_write_descriptor.
 *
 *
 *  Return values :
 *  ---------------
 *
 *  'OK'(=0)
 *
 *
 ************************************************************************/
static
INT32 EEPROM_IIC_write(
          UINT32 major,          /* IN: major device number             */
          UINT32 minor,          /* IN: minor device number             */
          t_EEPROM_write_descriptor *p_param )   /* IN: write buffer    */
{
    int    rcode ;
    UINT32 offset, left ;
    UINT8  startpage, endpage, iicadr, writecount ;
    UINT8  *user_buffer ;
    t_IIC_write_descriptor iic_write ;

    /* check minor device number */
    if (minor >= EEPROM_MINOR_DEVICE_COUNT)
    {
        return(ERROR_EEPROM_UNKNOWN_DEVICE) ;
    }

    /* check write request */
    if ( (p_param->offset + p_param->length) > device[minor].size )
    {
        return(ERROR_EEPROM_PARAM_OUT_OF_SPACE) ;
    }

    /* check mode */
    if ( device[minor].mode == EEPROM_READ_ONLY_MODE)
    {
        return(ERROR_EEPROM_READ_ONLY) ;
    }

    offset      = p_param->offset ;
    left        = p_param->length ;
    user_buffer = p_param->buffer ;
    while (left > 0)
    {
      startpage = offset / device[minor].pagesize ;
      endpage   = (offset + left) / device[minor].pagesize ;

      /* 1: calculate IIC slave address */
      iicadr = device[minor].iicadr + startpage ;

      /* 2: calculate bytes to write */
      if (startpage != endpage)
      {
          writecount = device[minor].pagesize - 
                       offset % device[minor].pagesize ;
      }
      else
      {
          writecount = left ;
      }

      /* 3: prepend offset to user data in temp buffer */
      iic_buffer[0] = offset % device[minor].pagesize ;
      memcpy( &iic_buffer[1], user_buffer, writecount ) ;

      /* 4: write 'writecount' */
      iic_write.IICaddress = iicadr ;
      iic_write.length     = writecount + 1 ;
      iic_write.buffer     = &iic_buffer[0] ;
      rcode = IO_write(SYS_MAJOR_IIC,0,&iic_write) ;
      if ( rcode != OK)
      {
          return(rcode) ;
      }

      /* 5: update context */
      left        = left - writecount ;
      offset      = offset + writecount ;
      user_buffer = user_buffer + writecount ;
    }
    return( OK ) ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -