Skip to content

Commit 3bb8ad6

Browse files
committed
libbladeRF: add functionality to lock OTP
1 parent 300d536 commit 3bb8ad6

File tree

5 files changed

+55
-0
lines changed

5 files changed

+55
-0
lines changed

host/libraries/libbladeRF/include/libbladeRF.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3749,6 +3749,19 @@ int CALL_CONV bladerf_write_flash_bytes(struct bladerf *dev,
37493749
uint32_t address,
37503750
uint32_t length);
37513751

3752+
/**
3753+
* Lock the bladeRF's OTP
3754+
*
3755+
* @param dev Device handle
3756+
*
3757+
* @return 0 on success,
3758+
* or ::BLADERF_ERR_INVAL on an invalid `page` or `count` value,
3759+
* or a value from \ref RETCODES list on other failures.
3760+
*/
3761+
3762+
API_EXPORT
3763+
int CALL_CONV bladerf_lock_otp(struct bladerf *dev);
3764+
37523765
/**
37533766
* Read data from the bladeRF's SPI flash OTP
37543767
*

host/libraries/libbladeRF/src/backend/backend.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ struct backend_fns {
132132
int (*get_cal)(struct bladerf *dev, char *cal);
133133
int (*get_otp)(struct bladerf *dev, char *otp);
134134
int (*write_otp)(struct bladerf *dev, char *otp);
135+
int (*lock_otp)(struct bladerf *dev);
135136
int (*get_device_speed)(struct bladerf *dev, bladerf_dev_speed *speed);
136137

137138
/* Configuration GPIO (NIOS II <-> logic) accessors */

host/libraries/libbladeRF/src/backend/dummy/dummy.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,11 @@ static int dummy_write_otp(struct bladerf *dev, char *otp)
142142
return 0;
143143
}
144144

145+
static int dummy_lock_otp(struct bladerf *dev)
146+
{
147+
return 0;
148+
}
149+
145150
static int dummy_get_device_speed(struct bladerf *dev,
146151
bladerf_dev_speed *device_speed)
147152
{
@@ -466,6 +471,7 @@ const struct backend_fns backend_fns_dummy = {
466471
FIELD_INIT(.get_cal, dummy_get_cal),
467472
FIELD_INIT(.get_otp, dummy_get_otp),
468473
FIELD_INIT(.write_otp, dummy_write_otp),
474+
FIELD_INIT(.lock_otp, dummy_lock_otp),
469475
FIELD_INIT(.get_device_speed, dummy_get_device_speed),
470476

471477
FIELD_INIT(.config_gpio_write, dummy_config_gpio_write),

host/libraries/libbladeRF/src/backend/usb/usb.c

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,28 @@ static int usb_write_otp(struct bladerf *dev, char *otp)
818818
return status == 0 ? restore_status : status;
819819
}
820820

821+
static int usb_lock_otp(struct bladerf *dev)
822+
{
823+
int status, restore_status, commit_status;
824+
825+
status = change_setting(dev, USB_IF_SPI_FLASH);
826+
if (status) {
827+
return status;
828+
}
829+
830+
status = vendor_cmd_int_windex(dev, BLADE_USB_CMD_LOCK_OTP,
831+
0, &commit_status);
832+
833+
if (commit_status != 0) {
834+
log_error("Failed to lock OTP, FW returned %d\n", commit_status);
835+
if (status == 0)
836+
status = commit_status;
837+
}
838+
839+
restore_status = restore_post_flash_setting(dev);
840+
return status == 0 ? restore_status : status;
841+
}
842+
821843
static int usb_get_device_speed(struct bladerf *dev, bladerf_dev_speed *speed)
822844
{
823845
struct bladerf_usb *usb = dev->backend_data;
@@ -1198,6 +1220,7 @@ const struct backend_fns backend_fns_usb_legacy = {
11981220
FIELD_INIT(.get_cal, usb_get_cal),
11991221
FIELD_INIT(.get_otp, usb_get_otp),
12001222
FIELD_INIT(.write_otp, usb_write_otp),
1223+
FIELD_INIT(.lock_otp, usb_lock_otp),
12011224
FIELD_INIT(.get_device_speed, usb_get_device_speed),
12021225

12031226
FIELD_INIT(.config_gpio_write, legacy_config_gpio_write),
@@ -1308,6 +1331,7 @@ const struct backend_fns backend_fns_usb = {
13081331
FIELD_INIT(.get_cal, usb_get_cal),
13091332
FIELD_INIT(.get_otp, usb_get_otp),
13101333
FIELD_INIT(.write_otp, usb_write_otp),
1334+
FIELD_INIT(.lock_otp, usb_lock_otp),
13111335
FIELD_INIT(.get_device_speed, usb_get_device_speed),
13121336

13131337
FIELD_INIT(.config_gpio_write, config_gpio_write),

host/libraries/libbladeRF/src/bladerf.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1550,6 +1550,17 @@ int bladerf_write_otp(struct bladerf *dev,
15501550
return status;
15511551
}
15521552

1553+
int bladerf_lock_otp(struct bladerf *dev)
1554+
{
1555+
int status;
1556+
MUTEX_LOCK(&dev->lock);
1557+
1558+
status = dev->backend->lock_otp(dev);
1559+
1560+
MUTEX_UNLOCK(&dev->lock);
1561+
return status;
1562+
}
1563+
15531564
/******************************************************************************/
15541565
/* Helpers & Miscellaneous */
15551566
/******************************************************************************/

0 commit comments

Comments
 (0)