| /* Copyright (C) 2011-2012 Humax Co., Ltd. All rights reserved. |
| * |
| * Humax Co., Ltd. ("Humax") hereby provides permission, free of charge, to any |
| * person obtaining a copy of this source code, to use and redistribute this |
| * source code with or without modification subject to the following conditions: |
| * |
| * 1. Redistributions of this source code must retain the above copyright |
| * notice, permission notice, this list of conditions and the following |
| * disclaimer. |
| * |
| * 2. Redistributions in binary form must reproduce the above copyright notice, |
| * permission notice, this list of conditions and the following disclaimer in |
| * the documentation and/or other materials provided with the distribution. |
| * |
| * THIS SOFTWARE IS PROVIDED BY HUMAX "AS IS" WITHOUT WARRANTY OF ANY KIND, |
| * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO WARRANTIES OF |
| * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ACCURACY, COMPLETENESS, |
| * CURRENCY, AVAILABILITY, TITLE OR NON-INFRINGEMENT. IN NO EVENT HUMAX OR |
| * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
| * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; |
| * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, |
| * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR |
| * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF OR OTHER DEALINGS IN THIS |
| * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| * The views and conclusion contained in the software and documentation are |
| * those of the authors and should not be interpreted as representing official |
| * policies, either expressed or implied, of Humax. |
| * |
| * Notwithstanding the above, under no circumstances may you combine this |
| * software in any way with any other Humax¿s software provided under a license |
| * other than the above license, without Humax's express prior written consent. |
| */ |
| /*******************************************************************/ |
| /************************* File Description ************************/ |
| /*******************************************************************/ |
| /* File Name: $Workfile: hmx_uprade_flash.c $ |
| * Version: $Revision: 1.0 $ |
| * Original Author: Yang Hyun Uk $ |
| * Current Author: $Author: huyang@humaxdigital.com $ |
| * Date: $Date: 2011.09.30 |
| * File Description: Humax Upgrade APIs |
| * Module: |
| * Remarks: |
| */ |
| |
| /** |
| * @defgroup UPGRADE_FLASH Flashing APIs for Upgrade Module |
| * @ingroup UPGRADE |
| * |
| */ |
| |
| /** |
| * @author Hyunuk Yang(huyang@humaxdigital.com) |
| * @date 30 Sept 2011 |
| */ |
| |
| /*@{*/ |
| |
| /** |
| * @file hmx_upgrade_flash.c |
| */ |
| |
| /*******************************************************************/ |
| /**************************** Header Files *************************/ |
| /*******************************************************************/ |
| /* Start Including Header Files */ |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <fcntl.h> |
| #include <unistd.h> |
| #include <sys/ioctl.h> |
| #include <sys/mount.h> |
| #include <mtd/mtd-user.h> |
| /* End Including Headers */ |
| |
| |
| /*******************************************************************/ |
| /****************************** define *****************************/ |
| /*******************************************************************/ |
| /* Start #define */ |
| /* this is for test */ |
| #define TARGET_NVRAM_MTD "/dev/mtd/hnvram" |
| /* End #define */ |
| |
| /*******************************************************************/ |
| /****************************** typedef ****************************/ |
| /*******************************************************************/ |
| /* Start typedef */ |
| /* End typedef */ |
| |
| |
| /*******************************************************************/ |
| /************************ global variables *************************/ |
| /*******************************************************************/ |
| /* Start global variable */ |
| int libupgrade_verbose = 1; |
| /* End global variable */ |
| |
| |
| /*******************************************************************/ |
| /************************ static variables *************************/ |
| /*******************************************************************/ |
| /* Start static variable */ |
| int fd_nvram = -1; |
| |
| /* End static variable */ |
| |
| /*******************************************************************/ |
| /************************ static funtions **************************/ |
| /*******************************************************************/ |
| int HMX_UPGRADE_NVRAM_Write(unsigned long offset, unsigned char * data, |
| unsigned int size ) |
| { |
| int ret; |
| void *buf; |
| |
| if (libupgrade_verbose) printf("[%s] offset %08lx, size %d, data = %02x\n", |
| __FUNCTION__, offset, size, data[0] ); |
| |
| buf = malloc(size); |
| if(!buf) { |
| perror("malloc"); |
| return -1; |
| } |
| |
| if ( fd_nvram < 0 ) { |
| fd_nvram = open(TARGET_NVRAM_MTD, (O_RDWR | O_SYNC) ); |
| if( fd_nvram < 0 ) { |
| perror(TARGET_NVRAM_MTD); |
| free(buf); |
| return -1; |
| } |
| } |
| |
| ret = lseek(fd_nvram, offset, SEEK_SET); |
| if(ret < 0) { |
| perror("lseek"); |
| free(buf); |
| return -1; |
| } |
| |
| /* Only write to flash if data is different from what is already there. */ |
| ret = read(fd_nvram, buf, size); |
| if(ret < 0) { |
| perror("read"); |
| free(buf); |
| return -1; |
| } |
| if (ret!=size || memcmp(data, buf, size)) { |
| ret = lseek(fd_nvram, offset, SEEK_SET); |
| if(ret < 0) { |
| perror("lseek"); |
| free(buf); |
| return -1; |
| } |
| |
| ret = write(fd_nvram, data, size); |
| if(ret < 0) { |
| perror("write"); |
| free(buf); |
| return -1; |
| } |
| } |
| |
| /* Writes to /dev/mtdblockX are cached indefinitely until the last file |
| * descriptor is closed. Flush this cache after writing. The user depends on |
| * data being physically written to flash when this function returns. |
| * Requires CAP_SYS_ADMIN. */ |
| ret = ioctl(fd_nvram, BLKFLSBUF, 0); |
| if(ret < 0) { |
| perror("ioctl(hnvram, BLKFLSBUF, 0)"); |
| free(buf); |
| return -1; |
| } |
| |
| free(buf); |
| return 0; |
| } |
| |
| int HMX_UPGRADE_NVRAM_Read(unsigned long offset, unsigned char * data, |
| unsigned int size ) |
| { |
| int ret; |
| |
| if (libupgrade_verbose) printf("[%s] offset %08lx, size %d, data = %02x\n", |
| __FUNCTION__, offset, size, data[0] ); |
| |
| /* */ |
| if ( fd_nvram < 0 ) { |
| fd_nvram = open(TARGET_NVRAM_MTD, (O_RDWR | O_SYNC) ); |
| if( fd_nvram < 0 ) { |
| perror(TARGET_NVRAM_MTD); |
| return -1; |
| } |
| } |
| |
| |
| ret = lseek(fd_nvram, offset, SEEK_SET); |
| if(ret < 0) { |
| perror("lseek"); |
| return -1; |
| } |
| |
| ret = read(fd_nvram, data, size); |
| if(ret < 0) { |
| perror("read"); |
| return ret; |
| } |
| |
| return 0; |
| } |
| |
| |
| /*@}*/ |