Jammy, If you have NAND driver enabled by default, that could take up the mtd0-mtd4 for the NAND partitions. The SPI-EEPROM would then be mtd5.
Thanks Sneha > -----Original Message----- > From: [email protected] > [mailto:[email protected]] On Behalf > Of Steve Chen > Sent: Thursday, December 25, 2008 9:07 AM > To: Jammy Dane > Cc: BJ_Opp; davinci-linux-open-source > Subject: Re: Re: FW: dm355 spi > > Jammy, > > The EEPROM shows up as mtd2 on with my setup. It is very unlikely the > EEPROM is mtd2 on your system. That's why in my original e-mail, I > suggested use > > > cat /proc/mtd > > to determine the correct mtd device node to use. > > Regards, > > Steve > > On Thu, 2008-12-25 at 21:45 +0800, Jammy Dane wrote: > > thanks steve, > > > > i have a doubt that why the eeprom is mtd2? > > > > > > 2008-12-25 > > > > ______________________________________________________________________ > > Jammy Dane > > > > ______________________________________________________________________ > > 发件人: Steve Chen > > 发送时间: 2008-12-24 22:33:20 > > 收件人: Jammy Dane > > 抄送: gasparini; BJ_Opp; davinci-linux-open-source > > 主题: Re: FW: dm355 spi > > > > Jammy, > > > > You can use echo/cat to /dev/mtd(x) to write to SPI EEPROM and > > strings /dev/mtd(x) to read (determine the proper value of x using > > 'cat /proc/mtd' of course). Alternatively, attached are a couple of > > simple programs I used to read/write to SPI EEPROM. Hopefully it would > > be helpful to get you started. > > > > Regards, > > > > Steve > > > > On Wed, 2008-12-24 at 21:34 +0800, Jammy Dane wrote: > > > Hi, I want use spi in dm355 evm, there is a driver like > > > at25xxA_eeprom.c, but there is no example for that, if i want to write > > > data to the eeprom or if i want to read data from it, how can use the > > > function? what is the process of writing or reading? may you give me > > > some advice, and thank you. > > > Below is the c code in mtd/devices/at25xxA_eeprom.c: > > > > > > #include <linux/module.h> > > > #include <linux/init.h> > > > #include <linux/types.h> > > > #include <linux/device.h> > > > #include <linux/spi/spi.h> > > > > > > #include <linux/mtd/mtd.h> > > > #include <linux/mtd/partitions.h> > > > > > > #include <asm/uaccess.h> > > > > > > #include <linux/spi/at25xxA_eeprom.h> > > > #include <linux/spi/dm355_spi_master.h> > > > > > > static struct davinci_eeprom_info *spi_eeprom_info; > > > > > > /* > > > * Utilities functions > > > */ > > > struct davinci_eeprom_info dm355_spi_eeprom_info = { > > > .eeprom_size = 8192, > > > .page_size = 32, > > > .page_mask = 0x001F, > > > .chip_sel = SCS0_SELECT, > > > }; > > > > > > #if 0 > > > static int spi_generic_eeprom_open(struct inode * inode, struct file * > file) > > > { > > > file->private_data = spi_eeprom_info; > > > return 0; > > > } > > > > > > static int spi_generic_eeprom_ioctl(struct inode *inode, struct file > *file, > > > unsigned int cmd, unsigned long arg) > > > { > > > return 0; > > > } > > > #endif > > > static int spi_generic_config(dm355_spi_config_t *spi_cfg) > > > { > > > if (spi_cfg == NULL) { > > > printk("spi_cfg = NULL\n"); > > > return -1; > > > } > > > > > > spi_cfg->clkInternal = TRUE; > > > spi_cfg->csHold = TRUE; > > > spi_cfg->intrLevel = FALSE; > > > spi_cfg->pinOpModes = SPI_OPMODE_SPISCS_4PIN; > > > spi_cfg->clkHigh = FALSE; > > > spi_cfg->lsbFirst = FALSE; > > > spi_cfg->parityEnable = TRUE; > > > spi_cfg->oddParity = FALSE; > > > spi_cfg->phaseIn = TRUE; > > > spi_cfg->op_mode = TRUE; /*Polling mode -> FALSE, Interrupt mode -> > TRUE */ > > > spi_cfg->loopBack = FALSE; /* loopback is disabled */ > > > > > > } > > > static int spi_generic_eeprom_read(struct mtd_info *mtd, loff_t from, > > > size_t count, size_t *retlen, u_char *buf) > > > { > > > u8 *tx_ptr, *rx_ptr; > > > int rx_cnt; > > > unsigned int addr; > > > unsigned long flags; > > > struct spi_transfer x[2]; > > > struct spi_message msg; > > > struct davinci_eeprom_info *priv_dat = mtd->priv; > > > > > > addr = (u16)from; > > > *retlen = 0; > > > if(addr > priv_dat->eeprom_size) > > > return -EINVAL; > > > > > > if (count > priv_dat->eeprom_size) > > > return -EINVAL; > > > > > > if((addr + count) > priv_dat->eeprom_size) > > > return -EINVAL; > > > > > > memset(x, 0, sizeof x); > > > down(&priv_dat->lock); > > > x[0].tx_buf = tx_ptr = priv_dat->tx_buffer; > > > > > > tx_ptr[0] = DM355_EEPROM_READ; > > > > > > x[0].len = 3; > > > > > > /* Handle data return from EEPROM */ > > > x[1].rx_buf = rx_ptr = priv_dat->rx_buffer; > > > > > > while (count > 0) { > > > if (likely(count > SPI_BUFFER_SIZE)) > > > rx_cnt = SPI_BUFFER_SIZE; > > > else > > > rx_cnt = count; > > > > > > spi_message_init(&msg); > > > /* setup read command */ > > > tx_ptr[1] = (addr >> 8) & 0xFF; > > > tx_ptr[2] = (addr & 0xFF); > > > > > > local_irq_save(flags); > > > spi_message_add_tail(&x[0], &msg); > > > > > > /* read the eeprom */ > > > x[1].len = rx_cnt; > > > spi_message_add_tail(&x[1], &msg); > > > local_irq_restore(flags); > > > > > > spi_sync(priv_dat->spi, &msg); > > > > > > //spi_read(priv_dat->spi, rx_ptr, rx_cnt); > > > memcpy(buf, rx_ptr, rx_cnt); > > > > > > buf += rx_cnt; > > > count -= rx_cnt; > > > addr += rx_cnt; > > > *retlen += rx_cnt; > > > } > > > up(&priv_dat->lock); > > > > > > return 0; > > > } > > > > > > static int spi_generic_eeprom_write (struct mtd_info *mtd, loff_t to, > > > size_t count, size_t *retlen, const u_char *buf) > > > { > > > char *ptr; > > > int status; > > > int tx_cnt; > > > unsigned int addr; > > > struct spi_transfer xfer[2]; > > > struct spi_message msg; > > > struct davinci_eeprom_info *priv_dat = mtd->priv; > > > unsigned long flags; > > > > > > addr = (u16)(to); > > > *retlen = 0; > > > memset(xfer, 0, sizeof xfer); > > > if(addr > priv_dat->eeprom_size) > > > return -EINVAL; > > > > > > if (count > priv_dat->eeprom_size) > > > return -EINVAL; > > > > > > if((addr + count) > priv_dat->eeprom_size) > > > return -EINVAL; > > > > > > down(&priv_dat->lock); > > > while(count > 0) { > > > xfer[0].tx_buf = ptr = priv_dat->tx_buffer; > > > > > > /* set write enable */ > > > ptr[0] = DM355_EEPROM_WREN; > > > spi_write(priv_dat->spi, ptr, 1); > > > > > > spi_message_init(&msg); > > > /* set the write command */ > > > ptr[0] = DM355_EEPROM_WRITE; > > > ptr[1] = (addr >> 8) & 0xFF; > > > ptr[2] = (addr & 0xFF); > > > xfer[0].len = DAVINCI_SPI_TX_CMD_SIZE; > > > local_irq_save(flags); > > > //spi_message_add_tail(&xfer[0], &msg); > > > > > > /* figure out the max transfer within a page */ > > > tx_cnt = priv_dat->page_size - (addr & priv_dat->page_mask); > > > //if((tx_cnt + DAVINCI_SPI_TX_CMD_SIZE) > SPI_BUFFER_SIZE) > > > // tx_cnt = SPI_BUFFER_SIZE - DAVINCI_SPI_TX_CMD_SIZE; > > > > > > if (count < tx_cnt) > > > tx_cnt = count; > > > > > > ptr = &priv_dat->tx_buffer[DAVINCI_SPI_TX_CMD_SIZE]; > > > //xfer[1].tx_buf = ptr; > > > xfer[0].len += tx_cnt; > > > memcpy(ptr, buf, tx_cnt); > > > //spi_write(priv_dat->spi, ptr, tx_cnt + DAVINCI_SPI_TX_CMD_SIZE); > > > spi_message_add_tail(&xfer[0], &msg); > > > local_irq_restore(flags); > > > status = spi_sync(priv_dat->spi, &msg); > > > > > > count -= tx_cnt; > > > buf += tx_cnt; > > > addr += tx_cnt; > > > *retlen += tx_cnt; > > > } > > > up(&priv_dat->lock); > > > > > > return (0); > > > } > > > > > > #if 0 > > > static int spi_generic_eeprom_release(struct inode * inode, struct > file * file) > > > { > > > return 0; > > > } > > > > > > struct file_operations spi_eeprom_ops = { > > > > > > .owner = THIS_MODULE, > > > .open = spi_generic_eeprom_open, > > > .ioctl = spi_generic_eeprom_ioctl, > > > .read = spi_generic_eeprom_read, > > > .write = spi_generic_eeprom_write, > > > .release = spi_generic_eeprom_release, > > > > > > }; > > > #endif > > > > > > static int spi_eeprom_generic_erase(struct mtd_info *mtd, > > > struct erase_info *instr) > > > { > > > *mtd; > > > *instr; > > > } > > > > > > static struct mtd_info davinci_at25; > > > static int __devinit eeprom_probe(struct spi_device *spi) > > > { > > > int ret; > > > static struct mtd_info *mtd; > > > > > > mtd = &davinci_at25; > > > memset(mtd, 0, sizeof(struct mtd_info)); > > > > > > /* are there any id we need to read? */ > > > spi_eeprom_info = &dm355_spi_eeprom_info; > > > spi_eeprom_info->spi = spi; > > > spi_generic_config(spi->controller_data); > > > spi_eeprom_info->spi_data = spi_master_get_devdata(spi->master); > > > init_MUTEX(&spi_eeprom_info->lock); > > > > > > mtd->priv = spi_eeprom_info; > > > mtd->size = spi_eeprom_info->eeprom_size; > > > mtd->flags = MTD_CAP_RAM; > > > mtd->read = spi_generic_eeprom_read; > > > mtd->write = spi_generic_eeprom_write; > > > mtd->erase = spi_eeprom_generic_erase; > > > mtd->type = MTD_RAM; > > > mtd->name = "spi_eeprom"; > > > mtd->erasesize = 0x10; > > > > > > ret = add_mtd_device(mtd); > > > //ret = register_chrdev(SPI_EEPROM_MAJOR, DAVINCI_SPI_EEPROM_NAME, > > > // &spi_eeprom_ops); > > > if (ret < 0) { > > > printk("at25xxA_spi_eeprom device register failed\n"); > > > } > > > printk("at25xxA_spi_eeprom device register Succeeded\n"); > > > return ret; > > > } > > > > > > static struct spi_driver spi_eeprom_driver = { > > > .driver = { > > > .name = DAVINCI_SPI_EEPROM_NAME, > > > .bus = &spi_bus_type, > > > .owner = THIS_MODULE, > > > }, > > > .probe = eeprom_probe, > > > /* since eeprom is soldered on, we don't need to worry about remove */ > > > }; > > > > > > static int __init spi_eeprom_init(void) > > > { > > > printk("at25xxA_spi_eeprom init \n"); > > > return spi_register_driver(&spi_eeprom_driver); > > > } > > > module_init(spi_eeprom_init); > > > > > > static void __exit spi_eeprom_exit(void) > > > { > > > printk("at25xxA_spi_eeprom exit \n"); > > > spi_unregister_driver(&spi_eeprom_driver); > > > } > > > module_exit(spi_eeprom_exit); > > > > > > MODULE_LICENSE("GPL"); > > > MODULE_AUTHOR("Steve Chen"); > > > MODULE_DESCRIPTION("SPI EEPROM driver"); > > > > > > 2008-12-24 > > > > > > ______________________________________________________________________ > > > Jammy Dane > > > _______________________________________________ > > > Davinci-linux-open-source mailing list > > > [email protected] > > > http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source > > > > > _______________________________________________ > Davinci-linux-open-source mailing list > [email protected] > http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
_______________________________________________ Davinci-linux-open-source mailing list [email protected] http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source
