1*592f4aedSMax Krummenacher/* 2*592f4aedSMax Krummenacher * Copyright (C) 2014-2016, Toradex AG 3*592f4aedSMax Krummenacher * 4*592f4aedSMax Krummenacher * SPDX-License-Identifier: GPL-2.0+ 5*592f4aedSMax Krummenacher */ 6*592f4aedSMax Krummenacher 7*592f4aedSMax Krummenacher// Register Output for PF0100 programmer 8*592f4aedSMax Krummenacher// Customer: Toradex AG 9*592f4aedSMax Krummenacher// Program: Apalis iMX6 10*592f4aedSMax Krummenacher// Sample marking: 11*592f4aedSMax Krummenacher// Date: 12.02.2014 12*592f4aedSMax Krummenacher// Time: 17:16:41 13*592f4aedSMax Krummenacher// Generated from Spreadsheet Revision: P1.8 14*592f4aedSMax Krummenacher 15*592f4aedSMax Krummenacher/* sed commands to get from programmer script to struct */ 16*592f4aedSMax Krummenacher/* sed -e 's/^WRITE_I2C:\(..\):\(..\)/\{pmic_i2c, 0x\1, 0x\2\},/g' -e 's/^DELAY:\([0-9]*\)/\{pmic_delay, 0, \1\},/g' pf0100_otp.txt > pf0100_otp.inc 17*592f4aedSMax Krummenacher sed -i -e 's/^VPGM:ON/\{pmic_vpgm, 0, 1},/g' -e 's/^VPGM:OFF/\{pmic_vpgm, 0, 0},/g' pf0100_otp.inc 18*592f4aedSMax Krummenacher sed -i -e 's/^PWRON: HIGH/\{pmic_pwr, 0, 1},/g' -e 's/^PWRON:LOW/\{pmic_pwr, 0, 0},/g' pf0100_otp.inc */ 19*592f4aedSMax Krummenacher 20*592f4aedSMax Krummenacherenum { pmic_i2c, pmic_delay, pmic_vpgm, pmic_pwr }; 21*592f4aedSMax Krummenacherstruct pmic_otp_prog_t{ 22*592f4aedSMax Krummenacher unsigned char cmd; 23*592f4aedSMax Krummenacher unsigned char reg; 24*592f4aedSMax Krummenacher unsigned short value; 25*592f4aedSMax Krummenacher}; 26*592f4aedSMax Krummenacher 27*592f4aedSMax Krummenacherstruct pmic_otp_prog_t pmic_otp_prog[] = { 28*592f4aedSMax Krummenacher{pmic_i2c, 0x7F, 0x01}, // Access FSL EXT Page 1 29*592f4aedSMax Krummenacher{pmic_i2c, 0xA0, 0x2B}, // Auto gen from Row94 30*592f4aedSMax Krummenacher{pmic_i2c, 0xA1, 0x01}, // Auto gen from Row95 31*592f4aedSMax Krummenacher{pmic_i2c, 0xA2, 0x05}, // Auto gen from Row96 32*592f4aedSMax Krummenacher{pmic_i2c, 0xA8, 0x2B}, // Auto gen from Row102 33*592f4aedSMax Krummenacher{pmic_i2c, 0xA9, 0x02}, // Auto gen from Row103 34*592f4aedSMax Krummenacher{pmic_i2c, 0xAA, 0x01}, // Auto gen from Row104 35*592f4aedSMax Krummenacher{pmic_i2c, 0xAC, 0x18}, // Auto gen from Row106 36*592f4aedSMax Krummenacher{pmic_i2c, 0xAE, 0x01}, // Auto gen from Row108 37*592f4aedSMax Krummenacher{pmic_i2c, 0xB0, 0x2C}, // Auto gen from Row110 38*592f4aedSMax Krummenacher{pmic_i2c, 0xB1, 0x04}, // Auto gen from Row111 39*592f4aedSMax Krummenacher{pmic_i2c, 0xB2, 0x01}, // Auto gen from Row112 40*592f4aedSMax Krummenacher{pmic_i2c, 0xB4, 0x2C}, // Auto gen from Row114 41*592f4aedSMax Krummenacher{pmic_i2c, 0xB5, 0x04}, // Auto gen from Row115 42*592f4aedSMax Krummenacher{pmic_i2c, 0xB6, 0x01}, // Auto gen from Row116 43*592f4aedSMax Krummenacher{pmic_i2c, 0xB8, 0x18}, // Auto gen from Row118 44*592f4aedSMax Krummenacher{pmic_i2c, 0xBA, 0x01}, // Auto gen from Row120 45*592f4aedSMax Krummenacher{pmic_i2c, 0xBD, 0x1F}, // Auto gen from Row123 46*592f4aedSMax Krummenacher{pmic_i2c, 0xC0, 0x06}, // Auto gen from Row126 47*592f4aedSMax Krummenacher{pmic_i2c, 0xC4, 0x04}, // Auto gen from Row130 48*592f4aedSMax Krummenacher{pmic_i2c, 0xC8, 0x0E}, // Auto gen from Row134 49*592f4aedSMax Krummenacher{pmic_i2c, 0xC9, 0x08}, // Auto gen from Row135 50*592f4aedSMax Krummenacher{pmic_i2c, 0xCC, 0x0E}, // Auto gen from Row138 51*592f4aedSMax Krummenacher{pmic_i2c, 0xCD, 0x05}, // Auto gen from Row139 52*592f4aedSMax Krummenacher{pmic_i2c, 0xD0, 0x0C}, // Auto gen from Row142 53*592f4aedSMax Krummenacher{pmic_i2c, 0xD1, 0x05}, // Auto gen from Row143 54*592f4aedSMax Krummenacher{pmic_i2c, 0xD5, 0x07}, // Auto gen from Row147 55*592f4aedSMax Krummenacher{pmic_i2c, 0xD8, 0x07}, // Auto gen from Row150 56*592f4aedSMax Krummenacher{pmic_i2c, 0xD9, 0x06}, // Auto gen from Row151 57*592f4aedSMax Krummenacher{pmic_i2c, 0xDC, 0x0A}, // Auto gen from Row154 58*592f4aedSMax Krummenacher{pmic_i2c, 0xDD, 0x03}, // Auto gen from Row155 59*592f4aedSMax Krummenacher{pmic_i2c, 0xE0, 0x07}, // Auto gen from Row158 60*592f4aedSMax Krummenacher 61*592f4aedSMax Krummenacher#if 0 /* TBB mode */ 62*592f4aedSMax Krummenacher{pmic_i2c, 0xE4, 0x80}, // TBB_POR = 1 63*592f4aedSMax Krummenacher{pmic_delay, 0, 10}, 64*592f4aedSMax Krummenacher#else 65*592f4aedSMax Krummenacher// Write OTP 66*592f4aedSMax Krummenacher{pmic_i2c, 0xE4, 0x02}, // FUSE POR1=1 67*592f4aedSMax Krummenacher{pmic_i2c, 0xE5, 0x02}, // FUSE POR2=1 68*592f4aedSMax Krummenacher{pmic_i2c, 0xE6, 0x02}, // FUSE POR3=1 69*592f4aedSMax Krummenacher{pmic_i2c, 0xF0, 0x1F}, // Enable ECC for fuse banks 1 to 5 by writing to OTP EN ECC0 register 70*592f4aedSMax Krummenacher{pmic_i2c, 0xF1, 0x1F}, // Enable ECC for fuse banks 6 to 10 by writing to OTP EN ECC1 register 71*592f4aedSMax Krummenacher{pmic_i2c, 0x7F, 0x02}, // Access PF0100 EXT Page2 72*592f4aedSMax Krummenacher{pmic_i2c, 0xD0, 0x1F}, // Set Auto ECC for fuse banks 1 to 5 by writing to OTP AUTO ECC0 register 73*592f4aedSMax Krummenacher{pmic_i2c, 0xD1, 0x1F}, // Set Auto ECC for fuse banks 6 to 10 by writing to OTP AUTO ECC1 register 74*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 75*592f4aedSMax Krummenacher{pmic_i2c, 0xF1, 0x00}, // Reset Bank 1 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 76*592f4aedSMax Krummenacher{pmic_i2c, 0xF2, 0x00}, // Reset Bank 2 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 77*592f4aedSMax Krummenacher{pmic_i2c, 0xF3, 0x00}, // Reset Bank 3 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 78*592f4aedSMax Krummenacher{pmic_i2c, 0xF4, 0x00}, // Reset Bank 4 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 79*592f4aedSMax Krummenacher{pmic_i2c, 0xF5, 0x00}, // Reset Bank 5 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 80*592f4aedSMax Krummenacher{pmic_i2c, 0xF6, 0x00}, // Reset Bank 6 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 81*592f4aedSMax Krummenacher{pmic_i2c, 0xF7, 0x00}, // Reset Bank 7 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 82*592f4aedSMax Krummenacher{pmic_i2c, 0xF8, 0x00}, // Reset Bank 8 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 83*592f4aedSMax Krummenacher{pmic_i2c, 0xF9, 0x00}, // Reset Bank 9 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 84*592f4aedSMax Krummenacher{pmic_i2c, 0xFA, 0x00}, // Reset Bank 10 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 85*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 86*592f4aedSMax Krummenacher{pmic_vpgm, 0, 1}, // Turn ON 8V SWBST 87*592f4aedSMax Krummenacher//VPGM:DOWN:n 88*592f4aedSMax Krummenacher//VPGM:UP:n 89*592f4aedSMax Krummenacher{pmic_delay, 0, 500}, // Adds 500msec delay to allow VPGM time to ramp up 90*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 91*592f4aedSMax Krummenacher// PF0100 OTP MANUAL-PROGRAMMING (BANK 1 thru 10) 92*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 93*592f4aedSMax Krummenacher// BANK 1 94*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 95*592f4aedSMax Krummenacher{pmic_i2c, 0xF1, 0x00}, // Reset Bank 1 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 96*592f4aedSMax Krummenacher{pmic_i2c, 0xF1, 0x03}, // Set Bank 1 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 97*592f4aedSMax Krummenacher{pmic_i2c, 0xF1, 0x0B}, // Set Bank 1 ANTIFUSE_EN 98*592f4aedSMax Krummenacher{pmic_delay, 0, 10}, // Allow time for bank programming to complete 99*592f4aedSMax Krummenacher{pmic_i2c, 0xF1, 0x03}, // Reset Bank 1 ANTIFUSE_EN 100*592f4aedSMax Krummenacher{pmic_i2c, 0xF1, 0x00}, // Reset Bank 1 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 101*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 102*592f4aedSMax Krummenacher// BANK 2 103*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 104*592f4aedSMax Krummenacher{pmic_i2c, 0xF2, 0x00}, // Reset Bank 2 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 105*592f4aedSMax Krummenacher{pmic_i2c, 0xF2, 0x03}, // Set Bank 2 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 106*592f4aedSMax Krummenacher{pmic_i2c, 0xF2, 0x0B}, // Set Bank 2 ANTIFUSE_EN 107*592f4aedSMax Krummenacher{pmic_delay, 0, 10}, // Allow time for bank programming to complete 108*592f4aedSMax Krummenacher{pmic_i2c, 0xF2, 0x03}, // Reset Bank 2 ANTIFUSE_EN 109*592f4aedSMax Krummenacher{pmic_i2c, 0xF2, 0x00}, // Reset Bank 2 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 110*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 111*592f4aedSMax Krummenacher// BANK 3 112*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 113*592f4aedSMax Krummenacher{pmic_i2c, 0xF3, 0x00}, // Reset Bank 3 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 114*592f4aedSMax Krummenacher{pmic_i2c, 0xF3, 0x03}, // Set Bank 3 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 115*592f4aedSMax Krummenacher{pmic_i2c, 0xF3, 0x0B}, // Set Bank 3 ANTIFUSE_EN 116*592f4aedSMax Krummenacher{pmic_delay, 0, 10}, // Allow time for bank programming to complete 117*592f4aedSMax Krummenacher{pmic_i2c, 0xF3, 0x03}, // Reset Bank 3 ANTIFUSE_EN 118*592f4aedSMax Krummenacher{pmic_i2c, 0xF3, 0x00}, // Reset Bank 3 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 119*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 120*592f4aedSMax Krummenacher// BANK 4 121*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 122*592f4aedSMax Krummenacher{pmic_i2c, 0xF4, 0x00}, // Reset Bank 4 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 123*592f4aedSMax Krummenacher{pmic_i2c, 0xF4, 0x03}, // Set Bank 4 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 124*592f4aedSMax Krummenacher{pmic_i2c, 0xF4, 0x0B}, // Set Bank 4 ANTIFUSE_EN 125*592f4aedSMax Krummenacher{pmic_delay, 0, 10}, // Allow time for bank programming to complete 126*592f4aedSMax Krummenacher{pmic_i2c, 0xF4, 0x03}, // Reset Bank 4 ANTIFUSE_EN 127*592f4aedSMax Krummenacher{pmic_i2c, 0xF4, 0x00}, // Reset Bank 4 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 128*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 129*592f4aedSMax Krummenacher// BANK 5 130*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 131*592f4aedSMax Krummenacher{pmic_i2c, 0xF5, 0x00}, // Reset Bank 5 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 132*592f4aedSMax Krummenacher{pmic_i2c, 0xF5, 0x03}, // Set Bank 5 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 133*592f4aedSMax Krummenacher{pmic_i2c, 0xF5, 0x0B}, // Set Bank 5 ANTIFUSE_EN 134*592f4aedSMax Krummenacher{pmic_delay, 0, 10}, // Allow time for bank programming to complete 135*592f4aedSMax Krummenacher{pmic_i2c, 0xF5, 0x03}, // Reset Bank 5 ANTIFUSE_EN 136*592f4aedSMax Krummenacher{pmic_i2c, 0xF5, 0x00}, // Reset Bank 5 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 137*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 138*592f4aedSMax Krummenacher// BANK 6 139*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 140*592f4aedSMax Krummenacher{pmic_i2c, 0xF6, 0x00}, // Reset Bank 6 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 141*592f4aedSMax Krummenacher{pmic_i2c, 0xF6, 0x03}, // Set Bank 6 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 142*592f4aedSMax Krummenacher{pmic_i2c, 0xF6, 0x0B}, // Set Bank 6 ANTIFUSE_EN 143*592f4aedSMax Krummenacher{pmic_delay, 0, 10}, // Allow time for bank programming to complete 144*592f4aedSMax Krummenacher{pmic_i2c, 0xF6, 0x03}, // Reset Bank 6 ANTIFUSE_EN 145*592f4aedSMax Krummenacher{pmic_i2c, 0xF6, 0x00}, // Reset Bank 6 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 146*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 147*592f4aedSMax Krummenacher// BANK 7 148*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 149*592f4aedSMax Krummenacher{pmic_i2c, 0xF7, 0x00}, // Reset Bank 7 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 150*592f4aedSMax Krummenacher{pmic_i2c, 0xF7, 0x03}, // Set Bank 7 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 151*592f4aedSMax Krummenacher{pmic_i2c, 0xF7, 0x0B}, // Set Bank 7 ANTIFUSE_EN 152*592f4aedSMax Krummenacher{pmic_delay, 0, 10}, // Allow time for bank programming to complete 153*592f4aedSMax Krummenacher{pmic_i2c, 0xF7, 0x03}, // Reset Bank 7 ANTIFUSE_EN 154*592f4aedSMax Krummenacher{pmic_i2c, 0xF7, 0x00}, // Reset Bank 7 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 155*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 156*592f4aedSMax Krummenacher// BANK 8 157*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 158*592f4aedSMax Krummenacher{pmic_i2c, 0xF8, 0x00}, // Reset Bank 8 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 159*592f4aedSMax Krummenacher{pmic_i2c, 0xF8, 0x03}, // Set Bank 8 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 160*592f4aedSMax Krummenacher{pmic_i2c, 0xF8, 0x0B}, // Set Bank 8 ANTIFUSE_EN 161*592f4aedSMax Krummenacher{pmic_delay, 0, 10}, // Allow time for bank programming to complete 162*592f4aedSMax Krummenacher{pmic_i2c, 0xF8, 0x03}, // Reset Bank 8 ANTIFUSE_EN 163*592f4aedSMax Krummenacher{pmic_i2c, 0xF8, 0x00}, // Reset Bank 8 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 164*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 165*592f4aedSMax Krummenacher// BANK 9 166*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 167*592f4aedSMax Krummenacher{pmic_i2c, 0xF9, 0x00}, // Reset Bank 9 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 168*592f4aedSMax Krummenacher{pmic_i2c, 0xF9, 0x03}, // Set Bank 9 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 169*592f4aedSMax Krummenacher{pmic_i2c, 0xF9, 0x0B}, // Set Bank 9 ANTIFUSE_EN 170*592f4aedSMax Krummenacher{pmic_delay, 0, 10}, // Allow time for bank programming to complete 171*592f4aedSMax Krummenacher{pmic_i2c, 0xF9, 0x03}, // Reset Bank 9 ANTIFUSE_EN 172*592f4aedSMax Krummenacher{pmic_i2c, 0xF9, 0x00}, // Reset Bank 9 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 173*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 174*592f4aedSMax Krummenacher// BANK 10 175*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 176*592f4aedSMax Krummenacher{pmic_i2c, 0xFA, 0x00}, // Reset Bank 10 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 177*592f4aedSMax Krummenacher{pmic_i2c, 0xFA, 0x03}, // Set Bank 10 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 178*592f4aedSMax Krummenacher{pmic_i2c, 0xFA, 0x0B}, // Set Bank 10 ANTIFUSE_EN 179*592f4aedSMax Krummenacher{pmic_delay, 0, 10}, // Allow time for bank programming to complete 180*592f4aedSMax Krummenacher{pmic_i2c, 0xFA, 0x03}, // Reset Bank 10 ANTIFUSE_EN 181*592f4aedSMax Krummenacher{pmic_i2c, 0xFA, 0x00}, // Reset Bank 10 ANTIFUSE_RW and ANTIFUSE_BYPASS bits 182*592f4aedSMax Krummenacher//----------------------------------------------------------------------------------- 183*592f4aedSMax Krummenacher{pmic_vpgm, 0, 0}, // Turn off 8V SWBST 184*592f4aedSMax Krummenacher{pmic_delay, 0, 500}, // Adds delay to allow VPGM to bleed off 185*592f4aedSMax Krummenacher{pmic_i2c, 0xD0, 0x00}, // Clear 186*592f4aedSMax Krummenacher{pmic_i2c, 0xD1, 0x00}, // Clear 187*592f4aedSMax Krummenacher{pmic_pwr, 0, 0}, // PWRON LOW to reload new OTP data 188*592f4aedSMax Krummenacher{pmic_delay, 0, 500}, 189*592f4aedSMax Krummenacher{pmic_pwr, 0, 1}, 190*592f4aedSMax Krummenacher#endif 191*592f4aedSMax Krummenacher};