Trên Freescale iMX31, làm cách nào tôi có thể dịch địa chỉ SDRAM sang địa chỉ CPU?


7

[Đâ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 A10thà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 0x80000F00trong 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 0x80000400trong 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?


Câu hỏi tuyệt vời! Thật không may, tôi không có nhiều kinh nghiệm liên quan đến RAM bên ngoài, nhưng tôi đã bỏ một phần thưởng cho câu hỏi của bạn với hy vọng rằng ai đó sẽ tìm thấy nó.
Kevin Vermeer

Hai phần của hướng dẫn là trái ngược nhau, trừ khi tôi hiểu lầm. Tôi có xu hướng tin vào điều sau. Các bit địa chỉ (không phải A10) có thể không quan tâm đến PRECHARGE ALL, vì vậy 0xF có thể là một nỗ lực để đặt A10 bất kể ánh xạ. Là bộ nhớ không hoạt động với khởi tạo này, và nếu không, bạn có thể mô tả vấn đề? Hoặc bạn đang muốn hiểu làm thế nào ánh xạ địa chỉ hoạt động trong hoạt động bình thường?
Andy

Câu trả lời:


6

Để trả lời câu hỏi cơ bản của bạn, để đến địa chỉ chân A10 của bộ nhớ, bạn cần xem bản đồ bộ nhớ cho thiết bị ARM ...

Trong trường hợp này, nó nhìn vào bản đồ bộ nhớ:

0x8000 0000 -> 0x8FFF FFFF được ánh xạ tới CSD0 (SDRAM / DDR)

0x9000 0000 -> 0x9FFF FFFF được ánh xạ tới CSD1 (SDRAM / DDR)

Bạn cần biết lựa chọn chip nào đã được sử dụng trong thiết kế PCB để xác định câu trả lời của bạn về việc DDR của bạn được gắn vào ngân hàng nào.

Điều này ngụ ý rằng A10 nằm ở 0x8000 0400 (như bạn đã đề cập) hoặc 0x9000 0400.

Về lý do tại sao 0x8000 0F00 được sử dụng thay cho 0x8000 0400 ... đọc biểu dữ liệu cho bộ nhớ đó ngụ ý, nhưng không nói rằng các chân địa chỉ khác, A (n) không quan tâm đến thao tác này vì vậy bộ mã hóa có thể chỉ ném vào một chữ F ở đó thay vì nhận ra rằng đó chỉ là số 4 cần thiết.

Tôi cũng không tìm thấy 2 phần của biểu dữ liệu này để mâu thuẫn với nhau. Đầu tiên về cơ bản chỉ là nói rằng bạn cần tham chiếu bản đồ bộ nhớ của thiết bị để xác định địa chỉ thực nơi bộ nhớ được ánh xạ để bạn có thể sử dụng địa chỉ đó làm cơ sở.

Dấu ngoặc kép cho bạn biết rằng bit 0 của địa chỉ tương ứng với chân địa chỉ 0 trên bộ nhớ ở chế độ này, điều này có thể không phải luôn luôn như vậy trong hoạt động bình thường. Nó có thể phụ thuộc vào độ rộng dữ liệu / địa chỉ của bộ nhớ kết hợp với các vấn đề căn chỉnh cho lõi.


Cảm ơn bạn đã làm sáng tỏ mọi thứ, và tôi nghĩ làm thế nào Fđi vào cuộc sống giống như bạn đã đề cập. Tôi có một đoạn mã khởi động DDR khác từ Freescale trong đó địa chỉ PRECHARGE ALL0x80000400!
Diệp Lưu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.