[Đây là bài đăng lại của https://stackoverflow.com/q/5346225/69172 ]
Tôi mới sử dụng iMX31 và các hệ thống nhúng, vui lòng giúp tôi hiểu bản dịch từ địa chỉ SDRAM sang địa chỉ CPU ARM, đặc biệt là trong các chế độ lệnh "đặc biệt" của bộ điều khiển SDRAM.
Đây là mã khởi tạo SDRAM mà tôi gặp vấn đề với:
ldr r0, ESDCTL_BASE_W
mov r2, #SDRAM_BASE_ADDR /* 0x80000000 */
ldr r1, =0x92100000 /* Precharge */
str r1, [r0]
ldr r1, =0x0
ldr r12, =0x80000F00
str r1, [r12]
ldr r1, =0xA2100000 /* Auto-refresh */
str r1, [r0]
ldr r1, =0x0
str r1, [r2]
ldr r1, SDRAM_0xB2100000 /* Load Mode Register */
str r1, [r0]
ldr r1, =0x0
strb r1, [r2, #0x33]
ldr r1, =0xFF
ldr r12, =0x81000000
RAM tôi có là Micron LPDDR MT46H64M32LF và mã này tuân theo quy trình khởi tạo độc đáo, nhưng trong bước PRECHARGE , địa chỉ 0x80000F00
đến từ đâu?
Từ hướng dẫn tham khảo iMX31 tôi đã học được rằng trong bước PRECHARGE , tôi cần đặt chân SDRAM A10
thành CAO, do đó sẽ dẫn đến TẤT CẢ CÔNG CỤ . Đây là văn bản về PRECHARGE từ RM:
... Trong khi ở chế độ này, quyền truy cập (đọc hoặc ghi) vào không gian địa chỉ SDRAM / LPDDR sẽ tạo ra chu kỳ lệnh nạp tiền. Bit địa chỉ SDRAM / LPDDR A10 xác định xem một ngân hàng, hoặc tất cả các ngân hàng, được nạp tiền bằng lệnh. Truy cập một địa chỉ có địa chỉ SDRAM / LPDDR A10 thấp sẽ chỉ nạp tiền cho ngân hàng được chọn bởi các địa chỉ ngân hàng, như được minh họa trong Hình 19-75. Ngược lại, truy cập với A10 cao sẽ nạp tiền cho tất cả các ngân hàng bất kể địa chỉ ngân hàng, ... Lưu ý rằng A10 là chân SDRAM, không phải là bus địa chỉ ARM A10 bit. Bản dịch của SDRAM A10 sang địa chỉ ARM tương ứng phụ thuộc vào cấu hình bộ nhớ.
Và đây là một văn bản khác trên xe buýt địa chỉ đa kênh trong chế độ đặc biệt của Rô-bốt:
Ví dụ, trong chế độ đặc biệt của Cv Ví dụ, để điều khiển bit MA10 (đối với lệnh nạp tiền tất cả), nên đặt bit CPU A10 (cho cả thiết bị ngoài 16 hoặc 32 bit). Logic tương tự có hiệu lực đối với lệnh đăng ký chế độ tải, như có thể thấy trong ví dụ về thói quen khởi tạo trên Phần 19.5.4.1, Khởi tạo SDRAM của LỊCH.
Theo văn bản trên và giả sử A0 là bit đầu tiên 0x80000000
, đặt A10 thành 1 sẽ cung cấp địa chỉ 0x80000400
, không phải 0x80000F00
trong mã. Tại sao???
Đoạn mã tôi đã trình bày ở đây được cho là hoạt động với DDR. Đối với SDRAM, nó thực sự sử dụng 0x80000400
trong PRECHARGE .
Có bất cứ điều gì liên quan đến các đặc tính của DDR? Và làm cách nào tôi có thể có được bản dịch phù hợp giữa các chân SDRAM và địa chỉ CPU ARM?