123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319 |
- /**
- * u3-tool - U3 USB stick manager
- * Copyright (C) 2007 Daviedev, daviedev@users.sourceforge.net
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; if not, write to the Free Software Foundation, Inc.,
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
- #ifndef __U3_COMMAND__
- #define __U3_COMMAND__
- /**
- * @file u3_commands.h
- *
- * This file declares the functions for controlling the
- * U3 device.
- */
- #include "u3.h"
- /********************************* structures *********************************/
- /**
- * Device property header structure
- */
- struct property_header {
- uint16_t id; /* Property ID */
- uint16_t unknown1;
- uint16_t length; /* Length of property including header */
- } __attribute__ ((packed));
- /**
- * Device property 0x03 structure
- */
- #define U3_MAX_SERIAL_LEN 16
- struct property_03 {
- struct property_header hdr; /* property header */
- uint32_t full_length; /* Actual Full length of property???? */
- uint8_t unknown1;
- uint32_t unknown2;
- char serial[U3_MAX_SERIAL_LEN]; /* Device Serial number */
- uint32_t unknown3;
- uint32_t device_size; /* Device size in sectors */
- } __attribute__ ((packed));
- /**
- * Device property 0x0C structure
- */
- struct property_0C {
- struct property_header hdr; /* property header */
- uint32_t max_pass_try; /* Maximum wrong password try */
- } __attribute__ ((packed));
- /**
- * partition information structure
- */
- struct part_info {
- uint8_t partition_count;
- uint32_t unknown1;
- uint32_t data_size; // in sectors
- uint32_t unknown2;
- uint32_t cd_size; // in sectors
- } __attribute__ ((packed));
- /**
- * Data partition information structure
- */
- struct dpart_info {
- uint32_t total_size; // size of data partition in sectors
- uint32_t secured_size; // size of secured zone in sectors
- uint32_t unlocked; // 1 = unlocked, 0 = locked
- uint32_t pass_try; // number of times incorrect password tries
- } __attribute__ ((packed));
- /**
- * Chip information structure
- */
- #define U3_MAX_CHIP_REVISION_LEN 8
- #define U3_MAX_CHIP_MANUFACTURER_LEN 16
- struct chip_info {
- char revision[U3_MAX_CHIP_REVISION_LEN];
- char manufacturer[U3_MAX_CHIP_MANUFACTURER_LEN];
- } __attribute__ ((packed));
- /********************************** functions *********************************/
- /**
- * Read device property page
- *
- * This reads a page of device properties from the device. A requested page is
- * stored, including there page header, in 'buffer'. If the buffer size, as
- * specified by 'buffer_length', is to small to store the whole page, only the
- * first 'buffer_length' bytes are stored. The caller should check if the full
- * page fitted into the buffer, by comparing the page length in the header with
- * the buffer length. If the function returns successfull then atleast
- * sizeof(struct property_header) bytes will be valid in the buffer, therefore
- * 'buffer_length should be atleast 6 byte. If a property page does not excist,
- * this function will fail.
- *
- * @param device U3 device handle
- * @param property_id The index of the requested property page
- * @param buffer The buffer to return the requested property page in.
- * @param buffer_length The allocated length of 'buffer' in bytes.
- *
- * @returns U3_SUCCESS if successful, else U3_FAILURE and
- * an error string can be obtained using u3_error()
- *
- * @see 'struct property_header', 'struct property_*'
- */
- int u3_read_device_property(u3_handle_t *device, uint16_t property_id,
- uint8_t *buffer, uint16_t buffer_length);
- /**
- * Repartiton device
- *
- * This repatitions the device into a CD and a data partition. All current data
- * will be lost. Creating a CD partition of size 0 will make this device an
- * ordenary USB stick.
- *
- * @param device U3 device handle
- * @param cd_size The size of the CD partition in 512 byte sectors.
- *
- * @returns U3_SUCCESS if successful, else U3_FAILURE and
- * an error string can be obtained using u3_error()
- */
- int u3_partition(u3_handle_t *device, uint32_t cd_size);
- /**
- * Write CD block
- *
- * This function write's a block to the CD partition. Blocks are 2048 bytes in
- * size.
- *
- * @param device U3 device handle
- * @param block_num The block number to write
- * @param block A pointer to buffer containing block
- *
- * @returns U3_SUCCESS if successful, else U3_FAILURE and
- * an error string can be obtained using u3_error()
- */
- int u3_cd_write(u3_handle_t *device, uint32_t block_num, uint8_t *block);
- /**
- * Direction to round sector count.
- *
- * @see 'u3_sector_round()'
- */
- enum round_dir { round_down=0, round_up=1 };
- /**
- * Round partition sector count to prevered value
- *
- * Round a number of sectors to a sector count that is allowed for partitioning
- * the device.
- *
- * @param device U3 device handle
- * @param direction direction to round(up or down).
- * @param size Size value to round. Rounded value is writen back to
- * this variable.
- *
- * @returns U3_SUCCESS if successful, else U3_FAILURE and
- * an error string can be obtained using u3_error()
- *
- * @see 'u3_partition()'
- */
- int u3_partition_sector_round(u3_handle_t *device,
- enum round_dir direction, uint32_t *size);
- /**
- * Round secure zone sector count to prevered value
- *
- * Round a number of sectors to a sector count that is allowed for a secure
- * zone on the data partition.
- *
- * @param device U3 device handle
- * @param direction direction to round(up or down).
- * @param size Size value to round. Rounded value is writen back to
- * this variable.
- *
- * @returns U3_SUCCESS if successful, else U3_FAILURE and
- * an error string can be obtained using u3_error()
- *
- * @see 'u3_enable_security()'
- */
- int u3_security_sector_round(u3_handle_t *device,
- enum round_dir direction, uint32_t *size);
- /**
- * Request partitioning information
- *
- * This request some information about the partition sizes
- *
- * @param device U3 device handle
- * @param info Pointer to structure used to return requested info.
- *
- * @returns U3_SUCCESS if successful, else U3_FAILURE and
- * an error string can be obtained using u3_error()
- *
- * @see 'struct part_info'
- */
- int u3_partition_info(u3_handle_t *device, struct part_info *info);
- /**
- * Request data partition information
- *
- * This request some information about the data partition
- *
- * @param device U3 device handle
- * @param info Pointer to structure used to return requested info.
- *
- * @returns U3_SUCCESS if successful, else U3_FAILURE and
- * an error string can be obtained using u3_error()
- *
- * @see 'struct dpart_info'
- */
- int u3_data_partition_info(u3_handle_t *device, struct dpart_info *info);
- /**
- * Request chip information
- *
- * This request some information about the USB chip used on the device.
- *
- * @param device U3 device handle
- * @param info Pointer to structure used to return requested info.
- *
- * @returns U3_SUCCESS if successful, else U3_FAILURE and
- * an error string can be obtained using u3_error()
- *
- * @see 'struct chip_info'
- */
- int u3_chip_info(u3_handle_t *device, struct chip_info *info);
- /**
- * Reset device
- *
- * This function tell's the device to reconnect. When the function returns
- * the device should have been reset and reconnected.
- * The exact working of this action is still vague
- *
- * @param device U3 device handle
- *
- * @returns U3_SUCCESS if successful, else U3_FAILURE and
- * an error string can be obtained using u3_error()
- */
- int u3_reset(u3_handle_t *device);
- /**
- * Enable device security
- *
- * This sets a password on the data partition.
- *
- * @param device U3 device handle
- * @param password The password for the private zone
- *
- * @returns U3_SUCCESS if successful, else U3_FAILURE and
- * an error string can be obtained using u3_error()
- */
- int u3_enable_security(u3_handle_t *device, const char *password);
- /**
- * Disable device security
- *
- * This removes the password from the data partition.
- *
- * @param device U3 device handle
- * @param password The password for the private zone
- * @param result Return variable for result True if unlocking succeeded,
- * else false
- *
- * @returns U3_SUCCESS if successful, else U3_FAILURE and
- * an error string can be obtained using u3_error()
- */
- int u3_disable_security(u3_handle_t *device, const char *password,
- int * result);
- /**
- * Unlock data partition
- *
- * This unlocks the data partition if the device is secured.
- *
- * @param device U3 device handle
- * @param password The password for the private zone
- * @param result Return variable for result True if unlocking succeeded,
- * else false
- *
- * @returns U3_SUCCESS if successful, else U3_FAILURE and
- * an error string can be obtained using u3_error()
- */
- int u3_unlock(u3_handle_t *device, const char *password, int *result);
- /**
- * Change password of data partition
- *
- * This changes the password of the data partition.
- *
- * @param device U3 device handle
- * @param old_password The current password of the private zone
- * @param new_password The new password of the private zone
- * @param result Return variable for result: True if password changed,
- * else False if old password incorrect.
- *
- * @returns U3_SUCCESS if successful, else U3_FAILURE and
- * an error string can be obtained using u3_error()
- */
- int u3_change_password(u3_handle_t *device, const char *old_password,
- const char *new_password, int *result);
- #endif // __U3_COMMAND__
|