私のARM(https://4donline.ihs.com/images/VipMasterIC/IC/ATML/ATML-S-A0001248554/ATML-S-A0001248554-1.pdf)の物理アドレスレジスタにmmap
でアクセスしようとしていますが、どのような長さを入れるべきか分かりません。
例えば、私が32ビットにアクセスできるアドレス0xFFFFFCE8
にレジスタがあるとします。 mmap size_t
に何を入れる必要がありますか?
ありがとうございました!
EDIT:
Hereとhere我々は、彼らが4096を入れて見て、それはほとんどの鉱山と同じSAM9である最初のものにすることができます。
なぜ、彼らは4096を置いたのですか?私がしなければ
多分ので:マップサイズとmmap無効な引数エラー
#include <unistd.h>
long sz = sysconf(_SC_PAGESIZE);
printf("%ld",sz);
Thの答えは4096です...
EDIT 2:
this postに基づいて、私はこの記述することができます。
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <fcntl.h>
#define handle_error(msg) \
do { perror(msg); exit(EXIT_FAILURE); } while (0)
#define PIOD_START_ADDR 0xFFFFFA00
#define PIOD_STOP_ADDR 0xFFFFFC00
#define PIOD_SIZE (PIOD_STOP_ADDR-PIOD_START_ADDR)
#define PIO_WPMR_OFFSET 0xE4 // PIO Write Protection Mode Register Bank D
#define PIO_PUER_OFFSET 0x64 // PIO Pull-Up Enable Register Bank D
#define PIO_PUSR_OFFSET 0x68 // PIO Pull-Up Status Register Bank D
#define LED7_ON 0xFFDFFFFF // LED7 Mask ON
#define LED7_OFF 0xFFFFFFFF // LED7 Mask OFF
#define DESABLE_WRITE_PROTECTION_BANK_D 0x50494F00 // Desable write protection
int main(void) {
volatile void *gpio_D_addr;
volatile unsigned int *gpio_pullup_enable_addr;
volatile unsigned int *gpio_pullup_status_addr;
volatile unsigned int *gpio_enable_write_addr;
int fd = open("/dev/mem", O_RDWR|O_SYNC);
if (fd < 0){
fprintf(stderr, "Unable to open port\n\r");
exit(fd);
}
gpio_D_addr = mmap(0, PIOD_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, PIOD_START_ADDR);
gpio_addr = mmap(0, GPIO1_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, GPIO1_START_ADDR);
if(gpio_D_addr == MAP_FAILED){
handle_error("mmap");
}
gpio_enable_write_addr = gpio_D_addr + PIO_WPMR_OFFSET;
gpio_pullup_enable_addr = gpio_D_addr + PIO_PUER_OFFSET;
gpio_pullup_status_addr = gpio_D_addr + PIO_PUSR_OFFSET;
*gpio_enable_write_addr = DESABLE_WRITE_PROTECTION_BANK_D;
*gpio_pullup_enable_addr = *gpio_pullup_status_addr & LED7_ON;
return 0;
}
をしかし、私はmmap: Invalid argument
を持っていますエラー。 - >しかし、これ(このthreadに感謝)のようにmmapを変更することによって:mmap(NULL, MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, PIOD_START_ADDR & ~MAP_MASK);
と:
#define MAP_SIZE 4096UL
#define MAP_MASK (MAP_SIZE - 1)
私はもはやエラーを持っていませんが、何も起こらなかった...
任意のアイデア?
助けていただきありがとうございます。私はすでにこの章を見ましたが、上の私の記事のEDITを見てください。 – Tagadac
私は4096値について考えていません。それを理解するためにはもっと研究が必要です。しかし、今、仕事の呼び出し:( – TomServo
これを行うことによって '#include 長いsz = sysconf(_SC_PAGESIZE); \t printf("%ld "、sz);'私たちは '4096'を持っています。 4096。 –
Tagadac