1. /dev/mem  - это устр-во или device
2. Вы на пол пути к истине, а именно вы сказали: 
который отображаеться
Вам нужно пробросить адреса которые отображаются в устро-ве в вашу программу тобишь в user space. тобишь в пространство пользователя, при помощи mmap.
Ведь что такое Адрес регистра 
$FFFFF800 правильно адрес в линейной памяти проца АРМ. в устр-ве /dev/mem они отображены также линейно. А вы работаете (ну не вы а ваша программа) со страничной памятью.. итого вам для адреса регистра нужно для программы построить страницы (отобразить из устр-ва в программу) через которую можно писать уже в регистр.. писать я думаю вы уже поняли через указатель и смещение от-но него 

Замечание: - проброс в большинстве случаев нужно делать от адреса кратным странице Linux-а а это 4 Кбайта. Тобишь вы не сможете сделать mmap скажем с адреса $FFFFF803.. нужно будет отобразить кратный адрес, получить указатель на него и сместиться и бла бла бла... 
Короче долго это писать вот код, он делает проброс GPIO - а если быть точным всего устр-ва GPIO для проца AM37xx от TI. (omap3) ну и в цикле дергает ногой 
 Код на Си, но я думаю все прозрачно:
Код на Си, но я думаю все прозрачно:- Код: Выделить всё
- #include <stdio.h>
 #include <fcntl.h>
 #include <stdlib.h>
 #include <sys/mman.h>
 #include <unistd.h>
 
 
 
 #define OMAP24XX_BASE_ADDRES_PER_CM 0x48005000
 
 // omap2+ PER_CM Register Summary
 #define CM_FCLKEN_PER     0x0000
 #define CM_ICLKEN_PER     0x0010
 #define CM_IDLEST_PER     0x0020
 #define CM_AUTOIDLE_PER   0x0030
 #define CM_CLKSEL_PER     0x0040
 #define CM_SLEEPDEP_PER   0x0044
 #define CM_CLKSTCTRL_PER  0x0048
 #define CM_CLKSTST_PER    0x004C
 
 
 
 
 
 
 
 
 
 #define OMAP24XX_BASE_ADDRES_GPIO1 0x48310000
 #define OMAP24XX_BASE_ADDRES_GPIO2 0x49050000
 #define OMAP24XX_BASE_ADDRES_GPIO3 0x49052000
 #define OMAP24XX_BASE_ADDRES_GPIO4 0x49054000
 #define OMAP24XX_BASE_ADDRES_GPIO5 0x49056000
 #define OMAP24XX_BASE_ADDRES_GPIO6 0x49058000
 
 
 
 // omap2+ specific GPIO registers
 #define OMAP24XX_GPIO_REVISION          0x0000
 #define OMAP24XX_GPIO_SYSCONFIG          0x0010
 #define OMAP24XX_GPIO_SYSSTATUS          0x0014
 #define OMAP24XX_GPIO_IRQSTATUS1       0x0018
 #define OMAP24XX_GPIO_IRQSTATUS2       0x0028
 #define OMAP24XX_GPIO_IRQENABLE2       0x002c
 #define OMAP24XX_GPIO_IRQENABLE1       0x001c
 #define OMAP24XX_GPIO_WAKE_EN            0x0020
 #define OMAP24XX_GPIO_CTRL              0x0030
 #define OMAP24XX_GPIO_OE                0x0034
 #define OMAP24XX_GPIO_DATAIN            0x0038
 #define OMAP24XX_GPIO_DATAOUT            0x003c
 #define OMAP24XX_GPIO_LEVELDETECT0     0x0040
 #define OMAP24XX_GPIO_LEVELDETECT1     0x0044
 #define OMAP24XX_GPIO_RISINGDETECT     0x0048
 #define OMAP24XX_GPIO_FALLINGDETECT     0x004c
 #define OMAP24XX_GPIO_DEBOUNCE_EN       0x0050
 #define OMAP24XX_GPIO_DEBOUNCE_VAL     0x0054
 #define OMAP24XX_GPIO_CLEARIRQENABLE1   0x0060
 #define OMAP24XX_GPIO_SETIRQENABLE1     0x0064
 #define OMAP24XX_GPIO_CLEARWKUENA       0x0080
 #define OMAP24XX_GPIO_SETWKUENA          0x0084
 #define OMAP24XX_GPIO_CLEARDATAOUT     0x0090
 #define OMAP24XX_GPIO_SETDATAOUT       0x0094
 
 #define GPIO_MAP_SIZE 4096
 
 #define PIN_MASK  ( (1<<16) | (1<<17) )
 
 
 
 struct OMAP3_GPIO{
 
 ///           Register Name     Type     Offset
 unsigned int  Revision;        // R      0x000
 unsigned char Reserv0[12];     // R      0x004
 unsigned int  SysConfig;       // RW     0x010
 unsigned int  SysStatus;       // R      0x014
 unsigned int  IrqStatus1;      // RW     0x018
 unsigned int  IrqEnable1;      // RW     0x01C
 unsigned int  WakeUpEnable;    // RW     0x020
 unsigned char Reserv1[4];      // R      0x024
 unsigned int  IrqStatus2;      // RW     0x028
 unsigned int  IrqEnable2;      // RW     0x02C
 unsigned int  Ctrl;            // RW     0x030
 unsigned int  OE;              // RW     0x034
 unsigned int  DataIN;          // R      0x038
 unsigned int  DataOUT;         // RW     0x03C
 unsigned int  LevelDetect0;    // RW     0x040
 unsigned int  LevelDetect1;    // RW     0x044
 unsigned int  RisingDetect;    // RW     0x048
 unsigned int  FallingDetect;   // RW     0x04C
 unsigned int  DebouncEnable;   // RW     0x050
 unsigned int  DebouncingTime;  // RW     0x054
 unsigned char Reserv2[8];      // R      0x058
 unsigned int  ClearIrqEnable1; // RW     0x060
 unsigned int  SetIrqEnable1;   // RW     0x064
 unsigned char Reserv3[8];      // R      0x068
 unsigned int  ClearIrqEnable2; // RW     0x070
 unsigned int  SetIrqEnable2;   // RW     0x074
 unsigned char Reserv4[8];      // R      0x078
 unsigned int  ClearWKUENA;     // RW     0x080
 unsigned int  SetWKUENA;       // RW     0x084
 unsigned char Reserv5[8];      // R      0x088
 unsigned int  ClearDataOUT;    // RW     0x090
 unsigned int  SetDataOUT;      // RW     0x094
 };
 
 
 int Enable_Clk_GPIO3(void)
 {
 int fd;
 void *mapped_base;
 
 
 fd = open("/dev/mem", O_RDWR);
 
 if( fd < 0 )
 {
 printf("Cannot open /dev/mem.\n");
 exit(EXIT_FAILURE);
 }
 
 printf("/dev/mem opened.\n");
 
 mapped_base = mmap(0, GPIO_MAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, fd, OMAP24XX_BASE_ADDRES_PER_CM);
 
 if (mapped_base == MAP_FAILED)
 {
 printf("Memory mapping error.\n");
 exit(EXIT_FAILURE);
 }
 
 printf("Memory block mapped at address %p.\n", mapped_base);
 
 unsigned int old_val = *(int *)(mapped_base + CM_FCLKEN_PER);
 printf("CM_FCLKEN_PER = 0x%x \n", old_val);
 
 *(int *)(mapped_base + CM_FCLKEN_PER)  = old_val | (1 << 14);
 
 old_val = *(int *)(mapped_base + CM_ICLKEN_PER);
 *(int *)(mapped_base + CM_ICLKEN_PER) = old_val | (1 << 14);
 
 printf("CM_ICLKEN_PER = 0x%x \n", *(int *)(mapped_base + CM_ICLKEN_PER));
 close(fd);
 }
 
 
 
 
 int main(void)
 {
 int fd;
 struct OMAP3_GPIO *GPIO3_Reg;
 
 
 fd = open("/dev/mem", O_RDWR);
 
 if( fd < 0 )
 {
 printf("Cannot open /dev/mem.\n");
 exit(EXIT_FAILURE);
 }
 
 printf("/dev/mem opened.\n");
 
 GPIO3_Reg = mmap(0, sizeof(struct OMAP3_GPIO), PROT_READ | PROT_WRITE, MAP_SHARED, fd, OMAP24XX_BASE_ADDRES_GPIO3);
 
 if (GPIO3_Reg == MAP_FAILED)
 {
 printf("Memory mapping error.\n");
 exit(EXIT_FAILURE);
 }
 
 printf("Memory block mapped at address %p.\n", GPIO3_Reg);
 
 
 printf("OMAP24XX_GPIO_OE = 0x%x \n", GPIO3_Reg->OE);
 unsigned int old_val = GPIO3_Reg->OE;
 
 GPIO3_Reg->OE  = ( old_val & ~(1<< 17) ) ;
 
 
 
 printf("SYSCONFIG = 0x%x \n", GPIO3_Reg->SysConfig);
 printf("SYSSTATUS = 0x%x \n", GPIO3_Reg->SysStatus);
 
 printf("OMAP24XX_GPIO_WAKE_EN = 0x%x \n",    GPIO3_Reg->WakeUpEnable);
 printf("OMAP24XX_GPIO_IRQENABLE1 = 0x%x \n", GPIO3_Reg->IrqEnable1);
 printf("OMAP24XX_GPIO_IRQENABLE2 = 0x%x \n", GPIO3_Reg->IrqEnable2);
 
 
 
 int val=0;
 
 while (1)
 {
 val = !val;
 
 if (val)
 {
 GPIO3_Reg->SetDataOUT = (1 << 17); // PIN_MASK;
 printf("Set \n");
 }
 else
 {
 GPIO3_Reg->ClearDataOUT = (1 << 17);//PIN_MASK;
 printf("Clear \n");
 }
 
 printf("DATAOUT = 0x%x \n", GPIO3_Reg->DataOUT);
 sleep (1);
 }
 
 return 0;
 }