Level 3
Level 3

# Explanation of FLSHID_CUST_TABLES_FAB_YR

We are trying to readout the fabrication year of the PSoC from the FLSHID_CUST_TABLES_FAB_YR register. As explained on page 1724 the year is found in the upper 4 bits of the register and contains values from 0 to 9.

What is the significance of those numbers? How do we get the actual year in which the PSoC was produced?

Best regards,

David

1 Solution
Moderator
Moderator

# Re: Explanation of FLSHID_CUST_TABLES_FAB_YR

David,

PSoC Creator provides user a global API CyGetUniqueId(uint32* uniqueId) in Cylib.c of PSoC3/4/5 project, function comment provide the information you concern.

But please note that "Cypress has not implemented a business process to ensure that the values programmed into these bytes are error free". So, if you MUST promise an absolutely unique ID for each product with 0% error,  this fab unique ID may not suitable to your design.

/*******************************************************************************

* Function Name: CyGetUniqueId

****************************************************************************//**

*

*  Returns the 64-bit unique ID of the device. The uniqueness of the number is

*  guaranteed for 10 years due to the die lot number having a cycle life of 10

*  years and even after 10 years, the probability of getting two identical

*  numbers is very small.

*******************************************************************************/

void CyGetUniqueId(uint32* uniqueId)

{

#if(CY_PSOC4)

uniqueId[0u]  =  (uint32)(* (reg8 *) CYREG_SFLASH_DIE_LOT0  );

uniqueId[0u] |= ((uint32)(* (reg8 *) CYREG_SFLASH_DIE_LOT1  ) <<  8u);

uniqueId[0u] |= ((uint32)(* (reg8 *) CYREG_SFLASH_DIE_LOT2  ) << 16u);

uniqueId[0u] |= ((uint32)(* (reg8 *) CYREG_SFLASH_DIE_WAFER ) << 24u);

uniqueId[1u]  =  (uint32)(* (reg8 *) CYREG_SFLASH_DIE_X     );

uniqueId[1u] |= ((uint32)(* (reg8 *) CYREG_SFLASH_DIE_Y     ) <<  8u);

uniqueId[1u] |= ((uint32)(* (reg8 *) CYREG_SFLASH_DIE_SORT  ) << 16u);

uniqueId[1u] |= ((uint32)(* (reg8 *) CYREG_SFLASH_DIE_MINOR ) << 24u);

#else // for PSoC3/5

uniqueId[0u]  =  (uint32) CY_GET_XTND_REG8((void CYFAR *) (CYREG_FLSHID_CUST_TABLES_LOT_LSB   ));

uniqueId[0u] |= ((uint32) CY_GET_XTND_REG8((void CYFAR *) (CYREG_FLSHID_CUST_TABLES_LOT_MSB   )) <<  8u);

uniqueId[0u] |= ((uint32) CY_GET_XTND_REG8((void CYFAR *) (CYREG_MLOGIC_REV_ID                )) << 16u);

uniqueId[0u] |= ((uint32) CY_GET_XTND_REG8((void CYFAR *) (CYREG_FLSHID_CUST_TABLES_WAFER_NUM )) << 24u);

uniqueId[1u]  =  (uint32) CY_GET_XTND_REG8((void CYFAR *) (CYREG_FLSHID_CUST_TABLES_X_LOC     ));

uniqueId[1u] |= ((uint32) CY_GET_XTND_REG8((void CYFAR *) (CYREG_FLSHID_CUST_TABLES_Y_LOC     )) <<  8u);

uniqueId[1u] |= ((uint32) CY_GET_XTND_REG8((void CYFAR *) (CYREG_FLSHID_CUST_TABLES_WRK_WK    )) << 16u);

uniqueId[1u] |= ((uint32) CY_GET_XTND_REG8((void CYFAR *) (CYREG_FLSHID_CUST_TABLES_FAB_YR    )) << 24u);

#endif  /* (CY_PSOC4) */

}

Vison

4 Replies
Moderator
Moderator

# Re: Explanation of FLSHID_CUST_TABLES_FAB_YR

We will check this and come back at the earliest.

Roy Liu
Moderator
Moderator

# Re: Explanation of FLSHID_CUST_TABLES_FAB_YR

Hi David,

The "Year: 0-9" mentioned in the document refers to the last digital of the 4 of a year, for example, if you read a "8", mostly this refers to this PSoC was produced in the year of 2018,  yes, it could be 2008 too, but you may try to differ this by reading the date code of the top marking of the device, the top marking use 4 digis for the date when the device was produced, for example, a TQFP-100pin package device, the last 4 digis of the secend lines indicates this, for example if you read 1702, this means the device was produced in the year of 2017, the 2nd Work Week.You can have a look at the document in http://www.cypress.com/documentation/other-resources/cypress-marking-format  to understand Cypress part marking format. Personally, I don't think Cypress would ship a device which was produced 10 years ago after you put the order so may be the single digi is enough when you want to get the year only by reading the register.

- Roy Liu

Roy Liu
Level 3
Level 3

# Re: Explanation of FLSHID_CUST_TABLES_FAB_YR

"The "Year: 0-9" mentioned in the document refers to the last digital of the 4 of a year"

That's what I feared... 😕

An additional question: are the lot numbers (registers 0x49000103-4u) unique for each lot over the product life cycle or do they also repeat themselves every x years? If they were unique, we could use them to identify PSoCs belonging to the same lot even after our products have been shipped for many years (lifetime > 10years).

Moderator
Moderator

# Re: Explanation of FLSHID_CUST_TABLES_FAB_YR

David,

PSoC Creator provides user a global API CyGetUniqueId(uint32* uniqueId) in Cylib.c of PSoC3/4/5 project, function comment provide the information you concern.

But please note that "Cypress has not implemented a business process to ensure that the values programmed into these bytes are error free". So, if you MUST promise an absolutely unique ID for each product with 0% error,  this fab unique ID may not suitable to your design.

/*******************************************************************************

* Function Name: CyGetUniqueId

****************************************************************************//**

*

*  Returns the 64-bit unique ID of the device. The uniqueness of the number is

*  guaranteed for 10 years due to the die lot number having a cycle life of 10

*  years and even after 10 years, the probability of getting two identical

*  numbers is very small.

*******************************************************************************/

void CyGetUniqueId(uint32* uniqueId)

{

#if(CY_PSOC4)

uniqueId[0u]  =  (uint32)(* (reg8 *) CYREG_SFLASH_DIE_LOT0  );

uniqueId[0u] |= ((uint32)(* (reg8 *) CYREG_SFLASH_DIE_LOT1  ) <<  8u);

uniqueId[0u] |= ((uint32)(* (reg8 *) CYREG_SFLASH_DIE_LOT2  ) << 16u);

uniqueId[0u] |= ((uint32)(* (reg8 *) CYREG_SFLASH_DIE_WAFER ) << 24u);

uniqueId[1u]  =  (uint32)(* (reg8 *) CYREG_SFLASH_DIE_X     );

uniqueId[1u] |= ((uint32)(* (reg8 *) CYREG_SFLASH_DIE_Y     ) <<  8u);

uniqueId[1u] |= ((uint32)(* (reg8 *) CYREG_SFLASH_DIE_SORT  ) << 16u);

uniqueId[1u] |= ((uint32)(* (reg8 *) CYREG_SFLASH_DIE_MINOR ) << 24u);

#else // for PSoC3/5

uniqueId[0u]  =  (uint32) CY_GET_XTND_REG8((void CYFAR *) (CYREG_FLSHID_CUST_TABLES_LOT_LSB   ));

uniqueId[0u] |= ((uint32) CY_GET_XTND_REG8((void CYFAR *) (CYREG_FLSHID_CUST_TABLES_LOT_MSB   )) <<  8u);

uniqueId[0u] |= ((uint32) CY_GET_XTND_REG8((void CYFAR *) (CYREG_MLOGIC_REV_ID                )) << 16u);

uniqueId[0u] |= ((uint32) CY_GET_XTND_REG8((void CYFAR *) (CYREG_FLSHID_CUST_TABLES_WAFER_NUM )) << 24u);

uniqueId[1u]  =  (uint32) CY_GET_XTND_REG8((void CYFAR *) (CYREG_FLSHID_CUST_TABLES_X_LOC     ));

uniqueId[1u] |= ((uint32) CY_GET_XTND_REG8((void CYFAR *) (CYREG_FLSHID_CUST_TABLES_Y_LOC     )) <<  8u);

uniqueId[1u] |= ((uint32) CY_GET_XTND_REG8((void CYFAR *) (CYREG_FLSHID_CUST_TABLES_WRK_WK    )) << 16u);

uniqueId[1u] |= ((uint32) CY_GET_XTND_REG8((void CYFAR *) (CYREG_FLSHID_CUST_TABLES_FAB_YR    )) << 24u);

#endif  /* (CY_PSOC4) */

}

Vison