u-boot-2016.05 이식: (7), u-boot에서 파일 시스템 쓰기 지원

7885 단어 3u-boot
u-boot 자체는 jffs2 포맷 파일 시스템에 대한 nand 명령을 지원하지만 yaffs2 포맷을 지원하지 않기 때문에 우리는 yaffs2 포맷 파일 시스템 명령을 지원하도록 수정하여 u-boot에서 검색.yaffs하고 관련 코드를 찾지 못하기 때문에 우리는 검색.jffs2으로 전환하여 u-boot-2016.05\cmdand에서 검색할 수 있다.c:do_nand 함수에서 관련 코드를 발견하고 관찰하면 u-boot이 nand에 대한 조작 지령이 u-boot-2016.05\cmdand에 있음을 발견할 수 있다.c:do_nand 함수 중.u-boot-2016.05에는 u-boot-2012.04.01처럼 yaffs의 코드가 없기 때문에 일부 코드는 u-boot-2012.04.01을 참고해야 한다.1、u-boot-2016.05\include\configs\smdk2440.h에 매크로 정의를 추가하려면 다음과 같이 하십시오.
#define CONFIG_CMD_NAND_YAFFS

2、u-boot-2016.05\cmdand.c:do_nand 함수의
#ifdef CONFIG_CMD_NAND_TRIMFFS
        } else if (!strcmp(s, ".trimffs")) {
            if (read) {
                printf("Unknown nand command suffix '%s'
"
, s); return 1; } ret = nand_write_skip_bad(nand, off, &rwsize, NULL, maxsize, (u_char *)addr, WITH_DROP_FFS | WITH_WR_VERIFY); #endif

추가
#ifdef CONFIG_CMD_NAND_YAFFS
        } else if (!strcmp(s, ".yaffs")) {
            if (read) {
                printf("Unknown nand command suffix '%s'.
"
, s); return 1; } ret = nand_write_skip_bad(nand, off, &rwsize, NULL, maxsize, (u_char *)addr, WITH_YAFFS_OOB); #endif

3、u-boot-2016.05\includeand.h의
#define WITH_WR_VERIFY  (1 << 1) /* verify data was written correctly */

추가
#define WITH_YAFFS_OOB  (1 << 0) /* whether write with yaffs format. This flag
                  * is a 'mode' meaning it cannot be mixed with
                  * other flags */

4、u-boot-2016.05\drivers\mtdandandutil.c:nand_write_skip_bad 함수
#ifdef CONFIG_CMD_NAND_YAFFS
        if (flags & WITH_YAFFS_OOB) {
            int page, pages;
            size_t pagesize = nand->writesize;
            size_t pagesize_oob = pagesize + nand->oobsize;
            struct mtd_oob_ops ops;

            ops.len = pagesize;
            ops.ooblen = nand->oobsize;
            ops.mode = MTD_OOB_RAW;
            ops.ooboffs = 0;

            pages = write_size / pagesize_oob;
            for (page = 0; page < pages; page++) {
                WATCHDOG_RESET();

                ops.datbuf = p_buffer;
                ops.oobbuf = ops.datbuf + pagesize;

                rval = nand->_write_oob(nand, offset, &ops);
                if (rval)
                    break;

                offset += pagesize;
                p_buffer += pagesize_oob;
            }
        }
        else
#endif
        {
        truncated_write_size = write_size;
#ifdef CONFIG_CMD_NAND_TRIMFFS
        if (flags & WITH_DROP_FFS)
            truncated_write_size = drop_ffs(nand, p_buffer,
                    &write_size);
#endif

            rval = nand_write(nand, offset, &truncated_write_size,
                    p_buffer);

            if ((flags & WITH_WR_VERIFY) && !rval)
                rval = nand_verify(nand, offset,
                    truncated_write_size, p_buffer);

            offset += write_size;
            p_buffer += write_size;
        }

바꾸다
        truncated_write_size = write_size;
#ifdef CONFIG_CMD_NAND_TRIMFFS
        if (flags & WITH_DROP_FFS)
            truncated_write_size = drop_ffs(nand, p_buffer,
                    &write_size);
#endif

        rval = nand_write(nand, offset, &truncated_write_size,
                p_buffer);

        if ((flags & WITH_WR_VERIFY) && !rval)
            rval = nand_verify(nand, offset,
                truncated_write_size, p_buffer);

        offset += write_size;
        p_buffer += write_size;

5、u-boot-2016.05\include\linux\mtd\mtd.h의
struct mtd_erase_region_info {
    uint64_t offset;        /* At which this region starts, from the beginning of the MTD */
    uint32_t erasesize;     /* For this region */
    uint32_t numblocks;     /* Number of blocks of erasesize in this region */
    unsigned long *lockmap;     /* If keeping bitmap of locks */
};

추가
/*
 * oob operation modes
 *
 * MTD_OOB_PLACE:   oob data are placed at the given offset
 * MTD_OOB_AUTO:    oob data are automatically placed at the free areas
 *          which are defined by the ecclayout
 * MTD_OOB_RAW:     mode to read raw data+oob in one chunk. The oob data
 *          is inserted into the data. Thats a raw image of the
 *          flash contents.
 */
typedef enum {
    MTD_OOB_PLACE,
    MTD_OOB_AUTO,
    MTD_OOB_RAW,
} mtd_oob_mode_t;

좋은 웹페이지 즐겨찾기