On Tuesday 19 May 2009 12:54:31 Raúl Sánchez Siles wrote:
>   Hello:
>
>   This is my first try to implement the x16_as_x8 flash bank option. It is
> working for me as I would expect flash to work, but please consider this
> patchset as work in progress since it may still has some flaws.
>
>   Al patches touch just src/flash/cfi.c file and should apply in this order
> to trunk.
>
>   The patchset consists of 4 patches, whose interest areas I
> explain and comment below:
>
> 03-x16_as_x8-command_address-subst
>   · Substitution of flash_address function for command_address function,
> except on code specific to intel. I have just focused on spansion flashes
> and I hadn't review intel flash specifications, so I decided to be
> conservative at first. Maybe someone can tell if the command_address
> function is also valid for intel chips. If so this patch could be grown to
> include those or eventually include the x16_as_x8 functionality into
> flash_address not needing this one.
>

-- 
Raúl Sánchez Siles

Departamento de Montaje

INFOGLOBAL, S. A.

* C/ Virgilio, 2. Ciudad de la Imagen.
28223 Pozuelo de Alarcón (Madrid), España
* T: +34 91 506 40 00
* F: +34 91 506 40 01


--- a/src/flash/cfi.c
+++ b/src/flash/cfi.c
@@ -182,7 +182,7 @@
 	target_t *target = bank->target;
 	u8 data[CFI_MAX_BUS_WIDTH];
 
-	target->type->read_memory(target, flash_address(bank, sector, offset), bank->bus_width, 1, data);
+	target->type->read_memory(target, command_address(bank, sector, offset), bank->bus_width, 1, data);
 
 	if (bank->target->endianness == TARGET_LITTLE_ENDIAN)
 		return data[0];
@@ -200,7 +200,7 @@
 	u8 data[CFI_MAX_BUS_WIDTH];
 	int i;
 
-	target->type->read_memory(target, flash_address(bank, sector, offset), bank->bus_width, 1, data);
+	target->type->read_memory(target, command_address(bank, sector, offset), bank->bus_width, 1, data);
 
 	if (bank->target->endianness == TARGET_LITTLE_ENDIAN)
 	{
@@ -417,7 +417,7 @@
 	if ((pri_ext->pri[0] != 'P') || (pri_ext->pri[1] != 'R') || (pri_ext->pri[2] != 'I'))
 	{
 		cfi_command(bank, 0xf0, command);
-		if((retval = target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
+		if((retval = target->type->write_memory(target, command_address(bank, 0, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
 		{
 			return retval;
 		}
@@ -490,7 +490,7 @@
 	if ((atmel_pri_ext.pri[0] != 'P') || (atmel_pri_ext.pri[1] != 'R') || (atmel_pri_ext.pri[2] != 'I'))
 	{
 		cfi_command(bank, 0xf0, command);
-		if((retval = target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
+		if((retval = target->type->write_memory(target, command_address(bank, 0, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
 		{
 			return retval;
 		}
@@ -729,37 +729,37 @@
 	for (i = first; i <= last; i++)
 	{
 		cfi_command(bank, 0xaa, command);
-		if((retval = target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command)) != ERROR_OK)
+		if((retval = target->type->write_memory(target, command_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command)) != ERROR_OK)
 		{
 			return retval;
 		}
 
 		cfi_command(bank, 0x55, command);
-		if((retval = target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock2), bank->bus_width, 1, command)) != ERROR_OK)
+		if((retval = target->type->write_memory(target, command_address(bank, 0, pri_ext->_unlock2), bank->bus_width, 1, command)) != ERROR_OK)
 		{
 			return retval;
 		}
 
 		cfi_command(bank, 0x80, command);
-		if((retval = target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command)) != ERROR_OK)
+		if((retval = target->type->write_memory(target, command_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command)) != ERROR_OK)
 		{
 			return retval;
 		}
 
 		cfi_command(bank, 0xaa, command);
-		if((retval = target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command)) != ERROR_OK)
+		if((retval = target->type->write_memory(target, command_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command)) != ERROR_OK)
 		{
 			return retval;
 		}
 
 		cfi_command(bank, 0x55, command);
-		if((retval = target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock2), bank->bus_width, 1, command)) != ERROR_OK)
+		if((retval = target->type->write_memory(target, command_address(bank, 0, pri_ext->_unlock2), bank->bus_width, 1, command)) != ERROR_OK)
 		{
 			return retval;
 		}
 
 		cfi_command(bank, 0x30, command);
-		if((retval = target->type->write_memory(target, flash_address(bank, i, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
+		if((retval = target->type->write_memory(target, command_address(bank, i, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
 		{
 			return retval;
 		}
@@ -769,7 +769,7 @@
 		else
 		{
 			cfi_command(bank, 0xf0, command);
-			if((retval = target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
+			if((retval = target->type->write_memory(target, command_address(bank, 0, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
 			{
 				return retval;
 			}
@@ -780,7 +780,7 @@
 	}
 
 	cfi_command(bank, 0xf0, command);
-	return target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
+	return target->type->write_memory(target, command_address(bank, 0, 0x0), bank->bus_width, 1, command);
 }
 
 static int cfi_erase(struct flash_bank_s *bank, int first, int last)
@@ -1503,9 +1503,9 @@
 		buf_set_u32(reg_params[2].value, 0, 32, thisrun_count / bank->bus_width);
 		buf_set_u32(reg_params[3].value, 0, 32, cfi_command_val(bank, 0xA0));
 		buf_set_u32(reg_params[4].value, 0, 32, cfi_command_val(bank, 0x80));
-		buf_set_u32(reg_params[6].value, 0, 32, flash_address(bank, 0, pri_ext->_unlock1));
+		buf_set_u32(reg_params[6].value, 0, 32, command_address(bank, 0, pri_ext->_unlock1));
 		buf_set_u32(reg_params[7].value, 0, 32, 0xaaaaaaaa);
-		buf_set_u32(reg_params[8].value, 0, 32, flash_address(bank, 0, pri_ext->_unlock2));
+		buf_set_u32(reg_params[8].value, 0, 32, command_address(bank, 0, pri_ext->_unlock2));
 		buf_set_u32(reg_params[9].value, 0, 32, 0x55555555);
 
 		retval = target->type->run_algorithm(target, 0, NULL, 10, reg_params,
@@ -1678,19 +1678,19 @@
 	u8 command[8];
 
 	cfi_command(bank, 0xaa, command);
-	if((retval = target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command)) != ERROR_OK)
+	if((retval = target->type->write_memory(target, command_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command)) != ERROR_OK)
 	{
 		return retval;
 	}
 
 	cfi_command(bank, 0x55, command);
-	if((retval = target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock2), bank->bus_width, 1, command)) != ERROR_OK)
+	if((retval = target->type->write_memory(target, command_address(bank, 0, pri_ext->_unlock2), bank->bus_width, 1, command)) != ERROR_OK)
 	{
 		return retval;
 	}
 
 	cfi_command(bank, 0xa0, command);
-	if((retval = target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command)) != ERROR_OK)
+	if((retval = target->type->write_memory(target, command_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command)) != ERROR_OK)
 	{
 		return retval;
 	}
@@ -1703,7 +1703,7 @@
 	if (cfi_spansion_wait_status_busy(bank, 1000 * (1 << cfi_info->word_write_timeout_max)) != ERROR_OK)
 	{
 		cfi_command(bank, 0xf0, command);
-		if((retval = target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
+		if((retval = target->type->write_memory(target, command_address(bank, 0, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
 		{
 			return retval;
 		}
@@ -1755,13 +1755,13 @@
 
 	// Unlock
 	cfi_command(bank, 0xaa, command);
-	if((retval = target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command)) != ERROR_OK)
+	if((retval = target->type->write_memory(target, command_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command)) != ERROR_OK)
 	{
 		return retval;
 	}
 
 	cfi_command(bank, 0x55, command);
-	if((retval = target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock2), bank->bus_width, 1, command)) != ERROR_OK)
+	if((retval = target->type->write_memory(target, command_address(bank, 0, pri_ext->_unlock2), bank->bus_width, 1, command)) != ERROR_OK)
 	{
 		return retval;
 	}
@@ -1795,7 +1795,7 @@
 	if (cfi_spansion_wait_status_busy(bank, 1000 * (1 << cfi_info->word_write_timeout_max)) != ERROR_OK)
 	{
 		cfi_command(bank, 0xf0, command);
-		if((retval = target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
+		if((retval = target->type->write_memory(target, command_address(bank, 0, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
 		{
 			return retval;
 		}
@@ -2010,12 +2010,12 @@
 
 	/* return to read array mode, so we can read from flash again for padding */
 	cfi_command(bank, 0xf0, current_word);
-	if((retval = target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, current_word)) != ERROR_OK)
+	if((retval = target->type->write_memory(target, command_address(bank, 0, 0x0), bank->bus_width, 1, current_word)) != ERROR_OK)
 	{
 		return retval;
 	}
 	cfi_command(bank, 0xff, current_word);
-	if((retval = target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, current_word)) != ERROR_OK)
+	if((retval = target->type->write_memory(target, command_address(bank, 0, 0x0), bank->bus_width, 1, current_word)) != ERROR_OK)
 	{
 		return retval;
 	}
@@ -2050,12 +2050,12 @@
 
 	/* return to read array mode */
 	cfi_command(bank, 0xf0, current_word);
-	if((retval = target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, current_word)) != ERROR_OK)
+	if((retval = target->type->write_memory(target, command_address(bank, 0, 0x0), bank->bus_width, 1, current_word)) != ERROR_OK)
 	{
 		return retval;
 	}
 	cfi_command(bank, 0xff, current_word);
-	return target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, current_word);
+	return target->type->write_memory(target, command_address(bank, 0, 0x0), bank->bus_width, 1, current_word);
 }
 
 static void cfi_fixup_atmel_reversed_erase_regions(flash_bank_t *bank, void *param)
@@ -2131,17 +2131,17 @@
 
 	/* switch to read identifier codes mode ("AUTOSELECT") */
 	cfi_command(bank, 0xaa, command);
-	if((retval = target->type->write_memory(target, flash_address(bank, 0, unlock1), bank->bus_width, 1, command)) != ERROR_OK)
+	if((retval = target->type->write_memory(target, command_address(bank, 0, unlock1), bank->bus_width, 1, command)) != ERROR_OK)
 	{
 		return retval;
 	}
 	cfi_command(bank, 0x55, command);
-	if((retval = target->type->write_memory(target, flash_address(bank, 0, unlock2), bank->bus_width, 1, command)) != ERROR_OK)
+	if((retval = target->type->write_memory(target, command_address(bank, 0, unlock2), bank->bus_width, 1, command)) != ERROR_OK)
 	{
 		return retval;
 	}
 	cfi_command(bank, 0x90, command);
-	if((retval = target->type->write_memory(target, flash_address(bank, 0, unlock1), bank->bus_width, 1, command)) != ERROR_OK)
+	if((retval = target->type->write_memory(target, command_address(bank, 0, unlock1), bank->bus_width, 1, command)) != ERROR_OK)
 	{
 		return retval;
 	}
@@ -2149,11 +2149,11 @@
 	if (bank->chip_width == 1)
 	{
 		u8 manufacturer, device_id;
-		if((retval = target_read_u8(target, flash_address(bank, 0, 0x00), &manufacturer)) != ERROR_OK)
+		if((retval = target_read_u8(target, command_address(bank, 0, 0x00), &manufacturer)) != ERROR_OK)
 		{
 			return retval;
 		}
-		if((retval = target_read_u8(target, flash_address(bank, 0, 0x01), &device_id)) != ERROR_OK)
+		if((retval = target_read_u8(target, command_address(bank, 0, 0x01), &device_id)) != ERROR_OK)
 		{
 			return retval;
 		}
@@ -2162,11 +2162,11 @@
 	}
 	else if (bank->chip_width == 2)
 	{
-		if((retval = target_read_u16(target, flash_address(bank, 0, 0x00), &cfi_info->manufacturer)) != ERROR_OK)
+		if((retval = target_read_u16(target, command_address(bank, 0, 0x00), &cfi_info->manufacturer)) != ERROR_OK)
 		{
 			return retval;
 		}
-		if((retval = target_read_u16(target, flash_address(bank, 0, 0x02), &cfi_info->device_id)) != ERROR_OK)
+		if((retval = target_read_u16(target, command_address(bank, 0, 0x02), &cfi_info->device_id)) != ERROR_OK)
 		{
 			return retval;
 		}
@@ -2175,12 +2175,12 @@
 	LOG_INFO("Flash Manufacturer/Device: 0x%04x 0x%04x", cfi_info->manufacturer, cfi_info->device_id);
 	/* switch back to read array mode */
 	cfi_command(bank, 0xf0, command);
-	if((retval = target->type->write_memory(target, flash_address(bank, 0, 0x00), bank->bus_width, 1, command)) != ERROR_OK)
+	if((retval = target->type->write_memory(target, command_address(bank, 0, 0x00), bank->bus_width, 1, command)) != ERROR_OK)
 	{
 		return retval;
 	}
 	cfi_command(bank, 0xff, command);
-	if((retval = target->type->write_memory(target, flash_address(bank, 0, 0x00), bank->bus_width, 1, command)) != ERROR_OK)
+	if((retval = target->type->write_memory(target, command_address(bank, 0, 0x00), bank->bus_width, 1, command)) != ERROR_OK)
 	{
 		return retval;
 	}
@@ -2201,7 +2201,7 @@
 		 * SST flashes clearly violate this, and we will consider them incompatbile for now
 		 */
 		cfi_command(bank, 0x98, command);
-		if((retval = target->type->write_memory(target, flash_address(bank, 0, 0x55), bank->bus_width, 1, command)) != ERROR_OK)
+		if((retval = target->type->write_memory(target, command_address(bank, 0, 0x55), bank->bus_width, 1, command)) != ERROR_OK)
 		{
 			return retval;
 		}
@@ -2215,12 +2215,12 @@
 		if ((cfi_info->qry[0] != 'Q') || (cfi_info->qry[1] != 'R') || (cfi_info->qry[2] != 'Y'))
 		{
 			cfi_command(bank, 0xf0, command);
-			if((retval = target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
+			if((retval = target->type->write_memory(target, command_address(bank, 0, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
 			{
 				return retval;
 			}
 			cfi_command(bank, 0xff, command);
-			if((retval = target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
+			if((retval = target->type->write_memory(target, command_address(bank, 0, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
 			{
 				return retval;
 			}
@@ -2305,12 +2305,12 @@
 		 * we use both reset commands, as some Intel flashes fail to recognize the 0xF0 command
 		 */
 		cfi_command(bank, 0xf0, command);
-		if((retval = target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
+		if((retval = target->type->write_memory(target, command_address(bank, 0, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
 		{
 			return retval;
 		}
 		cfi_command(bank, 0xff, command);
-		if((retval = target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
+		if((retval = target->type->write_memory(target, command_address(bank, 0, 0x0), bank->bus_width, 1, command)) != ERROR_OK)
 		{
 			return retval;
 		}
@@ -2437,19 +2437,19 @@
 	int i;
 
 	cfi_command(bank, 0xaa, command);
-	if((retval = target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command)) != ERROR_OK)
+	if((retval = target->type->write_memory(target, command_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command)) != ERROR_OK)
 	{
 		return retval;
 	}
 
 	cfi_command(bank, 0x55, command);
-	if((retval = target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock2), bank->bus_width, 1, command)) != ERROR_OK)
+	if((retval = target->type->write_memory(target, command_address(bank, 0, pri_ext->_unlock2), bank->bus_width, 1, command)) != ERROR_OK)
 	{
 		return retval;
 	}
 
 	cfi_command(bank, 0x90, command);
-	if((retval = target->type->write_memory(target, flash_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command)) != ERROR_OK)
+	if((retval = target->type->write_memory(target, command_address(bank, 0, pri_ext->_unlock1), bank->bus_width, 1, command)) != ERROR_OK)
 	{
 		return retval;
 	}
@@ -2465,7 +2465,7 @@
 	}
 
 	cfi_command(bank, 0xf0, command);
-	return target->type->write_memory(target, flash_address(bank, 0, 0x0), bank->bus_width, 1, command);
+	return target->type->write_memory(target, command_address(bank, 0, 0x0), bank->bus_width, 1, command);
 }
 
 static int cfi_protect_check(struct flash_bank_s *bank)
_______________________________________________
Openocd-development mailing list
Openocd-development@lists.berlios.de
https://lists.berlios.de/mailman/listinfo/openocd-development

Reply via email to