设为首页 加入收藏

TOP

rtthread移植到jz2440之BootLoader(二)
2019-09-01 23:09:19 】 浏览:102
Tags:rtthread 移植 jz2440 BootLoader
r
nand_data(void) { return NFDATA; } void nand_chip_id(void) { unsigned char buf[5]={0}; nand_select(); nand_cmd(0x90); nand_addr(0x00); buf[0] = nand_data(); buf[1] = nand_data(); buf[2] = nand_data(); buf[3] = nand_data(); buf[4] = nand_data(); nand_deselect(); puts("maker id\n\r"); puthex(buf[0]); puts("\n\r"); puts("device id\n\r"); puthex(buf[1]); puts("\n\r"); puts("3rd byte\n\r"); puthex(buf[2]); puts("\n\r"); puts("4th byte\n\r"); puthex(buf[3]); puts("\n\r"); puts("page size\n\r"); puthex(1 << (buf[3] & 0x03)); puts("\n\r"); puts("block size\n\r"); puthex(64 << ((buf[3] >> 4) & 0x03)); puts("\n\r"); puts("5th byte\n\r"); puthex(buf[4]); } void nand_w_data(unsigned char val) { NFDATA = val; } void nand_read(unsigned int addr, unsigned char *buf, unsigned int len) { int col = addr % 2048; int i = 0; /* 1. 选中 */ nand_select(); while (i < len) { /* 2. 发出读命令00h */ nand_cmd(0x00); /* 3. 发出地址(分5步发出) */ nand_addr(addr); /* 4. 发出读命令30h */ nand_cmd(0x30); /* 5. 判断状态 */ nand_wait_ready(); /* 6. 读数据 */ for (; (col < 2048) && (i < len); col++) { buf[i] = nand_data(); i++; addr++; } col = 0; } /* 7. 取消选中 */ nand_deselect(); } void nand_addr_byte(unsigned char addr) { volatile int i; NFADDR = addr; for(i=0; i<10; i++); } int nand_erase(unsigned int addr, unsigned int len) { int page = addr / 2048; if (addr & (0x1FFFF)) { puts("nand_erase err, addr is not block align\n\r"); return 0; } if (len & (0x1FFFF)) { puts("nand_erase err, len is not block align\n\r"); return 0; } nand_select(); while (1) { page = addr / 2048; nand_cmd(0x60); /* row/page addr */ nand_addr_byte(page & 0xff); nand_addr_byte((page>>8) & 0xff); nand_addr_byte((page>>16) & 0xff); nand_cmd(0xD0); nand_wait_ready(); len -= (128*1024); if (len == 0) break; addr += (128*1024); } nand_deselect(); return 1; } void nand_write(unsigned int addr, unsigned char *buf, unsigned int len) { int page = addr / 2048; int col = addr & (2048 - 1); int i = 0; nand_select(); while (1) { nand_cmd(0x80); nand_addr(addr); /* 发出数据 */ for (; (col < 2048) && (i < len); ) { nand_w_data(buf[i++]); } nand_cmd(0x10); nand_wait_ready(); if (i == len) break; else { /* 开始下一个循环page */ col = 0; page++; } } nand_deselect(); } #define PCLK 50000000 // init.c中的clock_init函数设置PCLK为50MHz #define UART_CLK PCLK // UART0的时钟源设为PCLK #define UART_BAUD_RATE 115200 // 波特率 #define UART_BRD ((UART_CLK / (UART_BAUD_RATE * 16)) - 1) /* * 初始化UART0 * 115200,8N1,无流控 */ void uart0_init(void) { GPHCON |= 0xa0; // GPH2,GPH3用作TXD0,RXD0 GPHUP = 0x0c; // GPH2,GPH3内部上拉 ULCON0 = 0x03; // 8N1(8个数据位,无较验,1个停止位) UCON0 = 0x05; // 查询方式,UART时钟源为PCLK UFCON0 = 0x00; // 不使用FIFO UMCON0 = 0x00; // 不使用流控 UBRDIV0 = UART_BRD; // 波特率为115200 } /* * 发送一个字符 */ void putc(unsigned char c) { /* 等待,直到发送缓冲区中的数据已经全部发送出去 */ while (!(UTRSTAT0 & TXD0READY))
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇痞子衡嵌入式:开启NXP-MCUBootUt.. 下一篇内存相关工具

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目