Linux内核驱动函数以及arm函数

常用

gpio_request

主要是告诉内核这地址被占用了。当其它地方调用同一地址的gpio_request就会报告错误,该地址已被申请。在/proc/mem应该会有地址占用表描述

其原型为 int gpio_request(unsigned gpio, const char *label)先说说其参数,gpio则为你要申请的哪一个管脚,label则是为其取一个名字。

writel() 用于读写寄存器

往内存映射的 I/O 空间上写数据,wirtel()  I/O 上写入 32 位数据 (4字节)

void writel (unsigned char data , unsigned short addr )

readl() 用于读写寄存器

从内存映射的 I/O 空间读取数据,readl 从 I/O 读取 32 位数据 ( 4 字节 )。

原型: 
unsigned char readl (unsigned int addr )
变量    addr  是 I/O 地址。
返回值 : 从 I/O 空间读取的数值。

ioremap

ioremap将一个IO地址空间映射到内核的虚拟地址空间上去,便于访问。

用mmap映射一个设备意味着使用户空间的一段地址关联到设备内存上,这使得只要程序在分配的地址范围内进行读取或写入,实际上就是对设备的访问。

内存重定向的一个概念,把一段内存映射到另外一段内存中去,最终,我们实际上访问的是重定向之后的内存空间。
就是通过ioremap这个函数来实现重定向,
这里的重定向,是指在驱动程序里面,可以进行内存的重定向——驱动程序是运行在用户空间和内核空间的一个接口,因此可以访问实际的内存地址(无论是不是重定向了)。但是,我们写的用户空间的应用程序,是无论如何也访问不了实际的内存的——想想就明白了,因为整个程序都是运行在虚拟内存中,怎么能意识到自己实际上在哪里呢?

不常用

int atexit

atexit函数是一个特殊的函数,它是在正常程序退出时调用的函数,我们把他叫为登记函数int atexit (void (*)(void))

⼀个进程可以登记若⼲个(具体⾃⼰验证⼀下)个函数,这些函数由exit⾃动调⽤,这些函数被称为终⽌处理函数, atexit函数可以登记这些函数。 exit调⽤终⽌处理函数的顺序和atexit登记的顺序相反(网上很多说造成顺序相反的原因是参数压栈造成的,参数的压栈是先进后出,和函数的栈帧相同),如果⼀个函数被多次登记,也会被多次调⽤。

int isatty(int filedes);


返回值:若为终端设备则返回1(真),否则返回0(假):主要功能是检查设备类型 , 判断文件描述词是否是为终端机。

    if (!isatty(STDIN_FILENO)) {
        fprintf(stderr, "this problem should be run at a terminal\n");
        exit(1);
    }

cgetattr

是一个函数,用来获取终端参数,成功返回零;失败返回非零,发生失败接口将设置errno错误标识。
int tcgetattr(int fd, struct termios *termios_p);
tcgetattr函数用于获取与终端相关的参数。参数fd为终端的文件描述符,返回的结果保存在termios 结构体中,该结构体一般包括如下的成员:

    // save terminal setting
    if(tcgetattr(STDIN_FILENO, &oldt) < 0) {
        perror("save the terminal setting");
        exit(1);
    }

    // set terminal as need
    newt = oldt;
    newt.c_lflag &= ~( ICANON | ECHO );
    if(tcsetattr(STDIN_FILENO,TCSANOW, &newt) < 0) {
        perror("set terminal");
        exit(1);
    }

stm32库

猜你喜欢

转载自blog.csdn.net/c1063891514/article/details/82385887
今日推荐