FB44B0开发板使用三星Samsung的S3C44B0处理器,对这款开发板感兴趣的地方在于它提供IDE接口。
现在支持IDE的开发板并不多见了,研究之后只有TE2440-II,使用三星S3C2440处理器,YL9200,使用ATMEL的AT91RM9200芯片。但价格都偏贵。这款44B0开发板以120元二手价格买到。
FB44B0开发板是44B0开发板中的简化板,没有核心板,全部集成在一张电路板上
板子上的FLASH芯片很奇怪,使用的是AMD的AM29LV160MB,(虽然芯片上的印字是AM29LV160DB,估计是封装时的错误吧)
JTAG接口是14针的,使用JLINK V8无法链接,也许是连接线的问题,反正没调出来
JTAG调试器只能使用Wiggler Parallel并口JTAG调试器
现在找到一台带并口的台式机也不容易了
所以现买了一个USB转并口,还买错了,现在很多都是所谓“打印线”,在XP和Win7中以USBPRINT驱动,转化为USB001端口打印
之后买了USB转真并口,好像是个德国芯片和驱动,驱动只能用在XP的32bit版本中,(Windows7的设置会很麻烦),结果还不好使
实际上,JTAG的用处只有重新烧录FLASH,还有进行DEBUG。
对于DEBUG还是不要过于依赖JTAG的好,44b0自带的启动程序是可以在内存中下载执行程序的,用输出的方式调试感觉更加有效
连接主板的串口1设置速率115200可以接收到以上输出
这个启动程序支持下载和执行
comrun
指令通过串口下载并执行
只能使用DNW工具下载,其他都不好用
netrun
netload
都需要使用TFTP向主板推送
在ADS中编译是必须指定传送的二进制执行文件必须是bin格式
烧录FLASH时必须使用
烧录工具和JTAG的支持工具都是比较老的,只能在XP的32位系统中执行
烧录的文件是HEX格式的,感觉BANYAN还是比较好用,虽然只是测试版
FlashPgm也可以成功烧录
对主板的测试的最主要目的还是了解IDE的控制方法
主板的例程源码有误,正确的寄存器定义如下,(已经过测试)
#define IDE_DAT 0x4000002 #define IDE_ERR 0x4000012 #define IDE_FEATURE IDE_ERR #define IDE_SEC_CNT 0x4000022 #define IDE_SEC_NUM 0x4000032 #define IDE_LBA0 IDE_SEC_NUM #define IDE_LBA1 0x400000a #define IDE_LBA2 0x400001a #define IDE_LBA3 0x400002a //#define IDE_LBA_SEL 0x400002a #define IDE_CMD 0x400003a #define IDE_STATUS 0x400003a #define IDE_ALT_STATUS 0x0400002c // R ->3F6h #define IDE_DEV_CTRL 0x0400002c // W ->3F6h #define IDE_DRV_ADDR 0x0400003c // R ->3F7h
所有这些寄存器都可以和PC主板对应
根据ATA7的标准描述,定义了DEVICE IDENTIFY命令的结构
static union UN_HD_DEV_IDENT { U8 byte[512]; U16 dat[256]; struct _s_devid { struct _s_conf { U16 rev_0:2; U16 resp_incomp:1; U16 rev_1:4; U16 removable:1; U16 rev_2:7; U16 ata:1; // 0 = ata } s_conf; // 0 U16 rev_1; // 1 U16 spec_conf; // 2 U16 rev_3[7]; // 3-9 U8 serial_number[20]; // 10-19 U16 rev_20[3]; // 20-22 U8 firmware_version[8]; // 23-26 U8 model_number[40]; // 27-46 struct _s_multi_cmd { U16 max_num:8; // 00h=resv 01h-ffh=max multi command number U16 fix:8; // 80h } s_multi_cmd; // 47 U16 rev_48; // 48 struct _s_compability { U16 rev0:8; U16 dma:1; U16 lba:1; U16 iordy_disable:1; U16 iordy_support:1; U16 rev12:1; U16 standby:1; U16 rev14:2; } s_compability; // 49 U16 compability2; // 50 U16 rev_51[2]; // 51-52 U16 ref53; // 53 U16 rev_54[5]; // 54-58 U16 multi_sector; // 59 U16 user_sector_number[2]; // 60-61 U16 rev_62; // 62 U16 multi_word_dma[6]; // 63-68 U16 rev_69[6]; // 69-74 U16 max_queue; // 75 U16 rev_76[4]; // 76-79 struct _s_major_number { U16 rev0:1; U16 ata1:1; U16 ata2:1; U16 ata3:1; U16 ata4:1; U16 ata5:1; U16 ata6:1; U16 ata7:1; U16 ata8:1; U16 ata9:1; U16 rev10:6; } s_major_number; // 80 U16 minor_number; // 81 struct _s_cmd_set { U16 smart:1; U16 security:1; U16 removable:1; U16 power_manage:1; U16 rev4:1; U16 write_cache:1; U16 look_ahead:1; U16 release_intr:1; U16 serv_intr:1; U16 reset:1; U16 protect_area:1; U16 rev11:1; U16 write_buf:1; U16 read_buf:1; U16 nop:1; U16 rev15:1; } s_cmd_set; // 82 U16 cmd_sets; // 83 U16 cmd_set_ext; // 84 struct _s_cmd_set s_cmd_set_enable; // 85 U16 cmd_sets_enable; // 86 U16 cmd_set_ext_enable; // 87 U16 dma_mode; // 88 U16 value89[6]; // 89-94 U16 stream[5]; // 95-99 U8 user_max_lba[8]; // 100-103 U16 stream_pio; // 104; U16 rev105; // 105 struct _s_phy_lgc_sec { U16 lgc_per_phy:4; // 2^? U16 rev4:8; U16 longer:1; // longer than 256 words per logic sector U16 multi_logic:1; // multi logic per phy sector U16 value14:2; // bit set to 14:1 15:0 } s_phy_lgc_sec; // 106 U16 interseek; // 107 U16 uniqueid[4]; // 108-111 U16 rev112[5]; // 112-116 U16 words_per_logic[2]; // 117-118 U16 rev119[8]; // 119-126 U16 removable_status; // 127 U16 sec_status; // 128 U16 vendor129[31]; // 129-159 U16 cfa_power; // 160 U16 rev161[15]; // 161-175 U16 serial_number_vendor[30]; // 176-205 U16 rev206[49]; // 206-254 U16 integrity; // 255 } s_devid; } u_hdpara;
寄存器同样支持LBA48协议
U8 ReadSectorLBA48(long long lba) { U8 lbas[6]; U16 dat; int ii; U8 stt; for (ii=0; ii<6; ii++) { lbas[ii] = lba; lba>>=8; } SetIdeCount(0); SetIdeCount(1); SetLBA2(lbas[5]); SetLBA1(lbas[4]); SetLBA0(lbas[3]); SetLBA2(lbas[2]); SetLBA1(lbas[1]); SetLBA0(lbas[0]); SetDrvLBA3(0xE0, 0); while ((inportb(IDE_STATUS) & 0xC0)!=0x40); SetIdeCmd(0x24); while ((inportb(IDE_STATUS) & 0x88)!=0x08); for (ii=0; ii<256; ii++) { dat = GetIdeData(); printf("0x%04x ", dat); } printf("\n"); stt = inportb(IDE_STATUS); while ((stt & 0x88) != 0x00) { stt = inportb(IDE_STATUS); } return stt; }
完整程序参照附件
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。