/**************************************************************************** * drivers/mtd/cfi.h * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ #ifndef __DRIVERS_MTD_CFI_H #define __DRIVERS_MTD_CFI_H /**************************************************************************** * Included Files ****************************************************************************/ #include #include /**************************************************************************** * Pre-processor definitions ****************************************************************************/ /**************************************************************************** * Public Types ****************************************************************************/ begin_packed_struct struct cfi_info_s { uint8_t qry[3]; /* query-unique ASCII string 'QRY' */ uint16_t p_id; /* primary vendor command set and control * interface id */ uint16_t p_addr; /* primary algorithm extended query table * address */ uint16_t a_id; /* alternative vendor command set and * control interface id */ uint16_t a_addr; /* alternative algorithm extended query * table address */ uint8_t vccmin; /* Vcc logic supply minimum program/erase * or write voltage */ uint8_t vccmax; /* Vcc logic supply maximum program/erase * or write voltage */ uint8_t vppmin; /* Vpp logic supply minimum program/erase * or write voltage */ uint8_t vppmax; /* Vpp logic supply maximum program/erase * or write voltage */ uint8_t single_write_timeout_typ; /* typical timeout per single byte/word/ * D-word program, 2^N us */ uint8_t buffer_write_timeout_typ; /* typical timeout for maximum-size * multi-byte program, 2^N us */ uint8_t block_erase_timeout_typ; /* typical timeout per individual block * erase, 2^N ms */ uint8_t chip_erase_timeout_typ; /* typical timeout for full chip erase, * 2^N ms */ uint8_t single_write_timeout_max; /* maximum timeout per single byte/word/ * D-word program, 2^N times typical */ uint8_t buffer_write_timeout_max; /* maximum timeout for multi-byte program, * 2^N times typical */ uint8_t block_erase_timeout_max; /* maximum timeout per individual block * erase, 2^N times typical */ uint8_t chip_erase_timeout_max; /* typical timeout for full chip erase, * 2^N times typical */ uint8_t device_size; /* device size = 2^N in number of bytes */ uint16_t interface_desc; /* flash device interface code * description */ uint16_t max_write_bytes_num; /* maximum number of bytes in multi-byte * program = 2^N */ uint8_t erase_region_num; /* number of erase block regions */ uint32_t erase_region_info[4]; /* erase block region information * bits 31-16 = z, where the erase blocks * within this region are z times 256 * bytes. * bits 15-0 = y, where y + 1 = number of * erase blocks within the erase block * region. */ }end_packed_struct; /* This type represents the state of the MTD device. The struct mtd_dev_s * must appear at the beginning of the definition so that you can freely * cast between pointers to struct mtd_dev_s and struct skel_dev_s. */ struct cfi_dev_s { /* Publicly visible representation of the interface */ struct mtd_dev_s mtd; /* Other implementation specific data may follow here */ uintptr_t base_addr; /* base address of cfi flash */ uintptr_t end_addr; /* end address of cfi flash */ size_t page_size; /* page size for read and write */ uint8_t bankwidth; /* port width of the whole device */ uint8_t dev_width; /* port width of single chip */ uint8_t dev_num; /* equals to bankwith divided by dev_width */ uint8_t cfi_offset; /* cfi offset address, 0x55 or 0x555 */ uint32_t unlock_addr1; /* unlock addr1 for amd */ uint32_t unlock_addr2; /* unlock addr2 for amd */ struct cfi_info_s info; /* struct of cfi information */ }; /**************************************************************************** * Public function prototypes ****************************************************************************/ size_t cfi_get_blocksize(FAR struct cfi_dev_s *cfi, uint8_t region); blkcnt_t cfi_get_blocknum(FAR struct cfi_dev_s *cfi, uint8_t region); blkcnt_t cfi_find_block(FAR struct cfi_dev_s *cfi, off_t offset); blkcnt_t cfi_get_total_blocknum(FAR struct cfi_dev_s *cfi); int cfi_check(FAR struct cfi_dev_s *cfi); void cfi_reset(FAR struct cfi_dev_s *cfi); int cfi_erase(FAR struct cfi_dev_s *cfi, blkcnt_t startblock, blkcnt_t blockcnt); int cfi_read(FAR struct cfi_dev_s *cfi, off_t offset, size_t nbytes, FAR uint8_t *buffer); int cfi_write(FAR struct cfi_dev_s *cfi, off_t offset, size_t nbytes, FAR const uint8_t *buffer); #endif /* __DRIVERS_MTD_CFI_H */