1、当自身的库里对变量做了封装,即对地址做了映射,则可以直接操作,如cc2530F256:P1DIR|=0X1<<4,p1_0=1
2、裸机操作,如cortex-A53,boot启动前的裸机操作:
#define GPIOB27_FUNC (unsigned int *)0xC001B024
#define GPIOB26_OUTENB (unsigned int *)0xC001B004
#define GPIOB26_OUT (unsigned int *)0xC001B000
*GPIOB26_FUNC &= ~(0x3<<20);
*GPIOB26_FUNC |= 0x1<<20;
3、封装了库函数,库函数里实现了对寄存器的操作,此时对寄存器只做了解,直接使用库函数如stm32的固件库
4、使用内核提供的虚拟地址映射(内核驱动层操作,应用层通过ioctl调用)
led.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <linux/kernel.h>
#include <asm-generic/ioctl.h>
#include <asm/io.h>
#include “led_drv.h”
#define NAME “led_drv”
#define GPIOB26_FUNC 0xC001B024
#define GPIOB26_OUTENB 0xC001B004
#define GPIOB26_OUT 0xC001B000
unsigned int *gpiob26_func_viraddr;
unsigned int *gpiob26_outenb_viraddr;
unsigned int *gpiob26_out_viraddr;
void led_addr_iomap(void)
{
gpi