常用
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);
}