您好,登錄后才能下訂單哦!
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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。