I can't get SET_FEATURES to work properly.
I believe GET_FEATURES is working - out of reset i read [0,0,0,0] as expected ( http://datasheet.octopart.com/MT29F4G08ABBDAH4%3AD-Micron-datasheet-11758868.pdf page 50). I can also replace it with another operation e.g. READ_ID and read the expected data.
However, when I try to write [8,0,0,0] with SET_FEATURES (address 0x90), I end up writing [F,0,0,0].
With different delays (unfortunately I don't have specifics - I'm experimenting with that right now) I have also read back [A,0,0,0].
Code:
static int nand_onfi_set_features(struct mtd_info *mtd, struct nand_chip *chip,
int addr, uint8_t *subfeature_param)
{
int status;
if (!chip->onfi_version)
return -EINVAL;
chip->cmdfunc(mtd, NAND_CMD_SET_FEATURES, addr, -1);
printk(KERN_ERR "nand_onfi_set_features addr: %x subfeature_param: %x %x %x %x\n",addr,subfeature_param[0],subfeature_param[1],subfeature_param[2],subfeature_param[3]);
ndelay(100); //tADL=min 70ns
chip->write_buf(mtd, subfeature_param, ONFI_SUBFEATURE_PARAM_LEN);
ndelay(1000); //tFEAT=max 1us=1000ns
status = chip->waitfunc(mtd, chip);
if (status & NAND_STATUS_FAIL)
return -EIO;
return 0;
}
static int nand_onfi_get_features(struct mtd_info *mtd, struct nand_chip *chip,
int addr, uint8_t *subfeature_param)
{
if (!chip->onfi_version)
return -EINVAL;
chip->cmdfunc(mtd, NAND_CMD_GET_FEATURES, addr, -1);
//chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1); //reads 2c dc 90 95 (correct, this is MT29F4G08ABADA)
//chip->cmdfunc(mtd, NAND_CMD_READID, 0x20, -1); //reads 'O' 'N' 'F' 'I' (correct)
ndelay(1000); //tFEAT=max 1us=1000ns
chip->read_buf(mtd, subfeature_param, ONFI_SUBFEATURE_PARAM_LEN);
printk(KERN_ERR "nand_onfi_get_features addr: %x subfeature_param: %x %x %x %x\n",addr,subfeature_param[0],subfeature_param[1],subfeature_param[2],subfeature_param[3]);
return 0;
}
Debug output:
nand_onfi_set_features addr: 90 subfeature_param: 8 0 0 0
nand_onfi_get_features addr: 90 subfeature_param: f 0 0 0