firmware.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * NCI based driver for Samsung S3FWRN5 NFC chip
  4. *
  5. * Copyright (C) 2015 Samsung Electrnoics
  6. * Robert Baldyga <r.baldyga@samsung.com>
  7. */
  8. #ifndef __LOCAL_S3FWRN5_FIRMWARE_H_
  9. #define __LOCAL_S3FWRN5_FIRMWARE_H_
  10. /* FW Message Types */
  11. #define S3FWRN5_FW_MSG_CMD 0x00
  12. #define S3FWRN5_FW_MSG_RSP 0x01
  13. #define S3FWRN5_FW_MSG_DATA 0x02
  14. /* FW Return Codes */
  15. #define S3FWRN5_FW_RET_SUCCESS 0x00
  16. #define S3FWRN5_FW_RET_MESSAGE_TYPE_INVALID 0x01
  17. #define S3FWRN5_FW_RET_COMMAND_INVALID 0x02
  18. #define S3FWRN5_FW_RET_PAGE_DATA_OVERFLOW 0x03
  19. #define S3FWRN5_FW_RET_SECT_DATA_OVERFLOW 0x04
  20. #define S3FWRN5_FW_RET_AUTHENTICATION_FAIL 0x05
  21. #define S3FWRN5_FW_RET_FLASH_OPERATION_FAIL 0x06
  22. #define S3FWRN5_FW_RET_ADDRESS_OUT_OF_RANGE 0x07
  23. #define S3FWRN5_FW_RET_PARAMETER_INVALID 0x08
  24. /* ---- FW Packet structures ---- */
  25. #define S3FWRN5_FW_HDR_SIZE 4
  26. struct s3fwrn5_fw_header {
  27. __u8 type;
  28. __u8 code;
  29. __u16 len;
  30. };
  31. #define S3FWRN5_FW_CMD_RESET 0x00
  32. #define S3FWRN5_FW_CMD_GET_BOOTINFO 0x01
  33. struct s3fwrn5_fw_cmd_get_bootinfo_rsp {
  34. __u8 hw_version[4];
  35. __u16 sector_size;
  36. __u16 page_size;
  37. __u16 frame_max_size;
  38. __u16 hw_buffer_size;
  39. };
  40. #define S3FWRN5_FW_CMD_ENTER_UPDATE_MODE 0x02
  41. struct s3fwrn5_fw_cmd_enter_updatemode {
  42. __u16 hashcode_size;
  43. __u16 signature_size;
  44. };
  45. #define S3FWRN5_FW_CMD_UPDATE_SECTOR 0x04
  46. struct s3fwrn5_fw_cmd_update_sector {
  47. __u32 base_address;
  48. };
  49. #define S3FWRN5_FW_CMD_COMPLETE_UPDATE_MODE 0x05
  50. struct s3fwrn5_fw_image {
  51. const struct firmware *fw;
  52. char date[13];
  53. u32 version;
  54. const void *sig;
  55. u32 sig_size;
  56. const void *image;
  57. u32 image_sectors;
  58. const void *custom_sig;
  59. u32 custom_sig_size;
  60. };
  61. struct s3fwrn5_fw_info {
  62. struct nci_dev *ndev;
  63. struct s3fwrn5_fw_image fw;
  64. char fw_name[NFC_FIRMWARE_NAME_MAXSIZE + 1];
  65. const void *sig;
  66. u32 sig_size;
  67. u32 sector_size;
  68. u32 base_addr;
  69. struct completion completion;
  70. struct sk_buff *rsp;
  71. char parity;
  72. };
  73. void s3fwrn5_fw_init(struct s3fwrn5_fw_info *fw_info, const char *fw_name);
  74. int s3fwrn5_fw_setup(struct s3fwrn5_fw_info *fw_info);
  75. bool s3fwrn5_fw_check_version(const struct s3fwrn5_fw_info *fw_info, u32 version);
  76. int s3fwrn5_fw_download(struct s3fwrn5_fw_info *fw_info);
  77. void s3fwrn5_fw_cleanup(struct s3fwrn5_fw_info *fw_info);
  78. int s3fwrn5_fw_recv_frame(struct nci_dev *ndev, struct sk_buff *skb);
  79. #endif /* __LOCAL_S3FWRN5_FIRMWARE_H_ */