⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cramfs.h

📁 source code of armboot for s3c4510
💻 H
字号:
#ifndef __CRAMFS_H__#define __CRAMFS_H__#include <byteswap.h>#include <endian.h>#define CRAMFS_BLOCKSIZE 4096		// *** 4096 == 0x1000 ***#define CRAMFS_BLOCKMASK 4095		// *** 4095 == 0x0FFF ***#define CRAMFS_BLOCKSHIFT  12		// *** 4096 == 2 ^ 12 ***#define CRAMFS_MAGIC     0x28cd3d45#define CRAMFS_SIGNATURE "Compressed ROMFS"#if 0typedef unsigned char u8;typedef unsigned short u16;typedef unsigned int u32;#endif/* * Width of various bitfields in struct cramfs_inode. */ #define CRAMFS_MODE_WIDTH 16#define CRAMFS_UID_WIDTH 16#define CRAMFS_SIZE_WIDTH 24#define CRAMFS_GID_WIDTH 8#define CRAMFS_NAMELEN_WIDTH 6#define CRAMFS_OFFSET_WIDTH 26#define C_DIR_MASK  0x4000#define C_RD_MASK 0x120#define C_WR_MASK 0x092#define C_EX_MASK 0x049#define ISDIR(X) (X & C_DIR_MASK ? 1 : 0)#define ISRD(X) (X & C_RD_MASK ? 1 : 0)#define ISWR(X) (X & C_WR_MASK ? 1 : 0)#define ISEX(X) (X & C_EX_MASK ? 1 : 0)struct cramfs_inode {  unsigned long mode   : CRAMFS_MODE_WIDTH,                uid    : CRAMFS_UID_WIDTH;  unsigned long size   : CRAMFS_SIZE_WIDTH,                gid    : CRAMFS_GID_WIDTH;  unsigned long namelen: CRAMFS_NAMELEN_WIDTH,                offset : CRAMFS_OFFSET_WIDTH;};struct cramfs_info {  unsigned long crc;  unsigned long version;  unsigned long blocks;  unsigned long files;};/* * Superblock information at the beginning of the FS. */struct cramfs_super {  unsigned long magic;  unsigned long size;  unsigned long flags;  unsigned long reserved;  unsigned char signature[16];  struct cramfs_info info;  unsigned char name[16];  struct cramfs_inode root;};#define cramfs_get_block(ptr,inode,blknum,destination) \	cramfs_inflate(ptr,inode,destination,blknum*CRAMFS_BLOCKSIZE,CRAMFS_BLOCKSIZE)struct cramfs_super * cramfs_get_super(void * ptr);struct cramfs_inode * cramfs_get_root(void * ptr);struct cramfs_inode * cramfs_readdir_next(void * ptr, struct cramfs_inode * dir, struct cramfs_inode * current);char * cramfs_get_name(void * ptr, struct cramfs_inode * inode);int cramfs_get_size(void * ptr, struct cramfs_inode * inode);struct cramfs_inode * cramfs_lookup(void * ptr, struct cramfs_inode * cwd, char * name);int cramfs_inflate (void * ptr, struct cramfs_inode * inode, void * destination,        int offset, int size);/* * Since cramfs is little-endian, provide macros to swab the bitfields. */#define swap16_(x) \	((((x) >> 8) & 0xff) | (((x) & 0xff) << 8))#define swap32_(x) \	((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) | \	(((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))#ifndef __BYTE_ORDER#if defined(__LITTLE_ENDIAN) && !defined(__BIG_ENDIAN)#define __BYTE_ORDER __LITTLE_ENDIAN#elif defined(__BIG_ENDIAN) && !defined(__LITTLE_ENDIAN)#define __BYTE_ORDER __BIG_ENDIAN#else#error "unable to define __BYTE_ORDER"#endif#endif /* not __BYTE_ORDER */#if __BYTE_ORDER == __LITTLE_ENDIAN#warning  "__BYTE_ORDER == __LITTLE_ENDIAN"#define CRAMFS_16(x)   (x)#define CRAMFS_24(x)   (x)#define CRAMFS_32(x)   (x)#define CRAMFS_GET_NAMELEN(x)  ((x)->namelen)#define CRAMFS_GET_OFFSET(x)   ((x)->offset)#define CRAMFS_SET_OFFSET(x,y) ((x)->offset = (y))#define CRAMFS_SET_NAMELEN(x,y)        ((x)->namelen = (y))#elif __BYTE_ORDER == __BIG_ENDIAN#warning "__BYTE_ORDER == __BIG_ENDIAN"#ifdef	CONFIG_M68328/* Use M68K DragonBall specific swap instruction to speed up */#define	CRAMFS_16(x)	bswap_16(x)#define	CRAMFS_24(x)	((bswap_32(x)) >> 8)#define	CRAMFS_32(x)	bswap_32(x)#else/* For other case, including M68K ColdFire.... */#define CRAMFS_16(x)   swap16_(x)#define CRAMFS_24(x)   ((swap32_(x)) >> 8)#define CRAMFS_32(x)   swap32_(x)#endif#define CRAMFS_GET_NAMELEN(x)  (((u8*)(x))[8] & 0x3f)#define CRAMFS_GET_OFFSET(x)   ((CRAMFS_24(((u32*)(x))[2] & 0xffffff) << 2) |\                                ((((u32*)(x))[2] & 0xc0000000) >> 30))#define CRAMFS_SET_NAMELEN(x,y)        (((u8*)(x))[8] = (((0x3f & (y))) | \                                                 (0xc0 & ((u8*)(x))[8])))#define CRAMFS_SET_OFFSET(x,y) (((u32*)(x))[2] = (((y) & 3) << 30) | \                                CRAMFS_24((((y) & 0x03ffffff) >> 2)) | \                                (((u32)(((u8*)(x))[8] & 0x3f)) << 24))#else#error "__BYTE_ORDER must be __LITTLE_ENDIAN or __BIG_ENDIAN"#endif#endif /* __CRAMFS_H__ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -