LDD3学习笔记(12):与硬件通讯

简介:  #include void barrier(void)这个"软件"内存屏蔽要求编译器对待所有内存是跨这个指令而非易失的.#include void rmb(void);void read_barrier_depends(void);void wmb(void);void mb(void);硬件内存屏障.
  #include <linux/kernel.h>

void barrier(void)

这个"软件"内存屏蔽要求编译器对待所有内存是跨这个指令而非易失的.

#include <asm/system.h>

void rmb(void);

void read_barrier_depends(void);

void wmb(void);

void mb(void);

硬件内存屏障它们请求 CPU(和编译器)来检查所有的跨这个指令的内存读或都有.

#include <asm/io.h>

unsigned inb(unsigned port);

void outb(unsigned char byte, unsigned port);

unsigned inw(unsigned port);

void outw(unsigned short word, unsigned port);

unsigned inl(unsigned port);

void outl(unsigned doubleword, unsigned port);

用来读和写 I/O 端口的函数它们还可以被用户空间程序调用如果它们有正当的权限来存

取端口.

unsigned inb_p(unsigned port);

如果在一次 I/O 操作后需要一个小延时你可以使用在前一项中介绍的这些函数的 个暂停

对应部分这些暂停函数有以 _p 结尾的名子.

void insb(unsigned port, void *addr, unsigned long count);

void outsb(unsigned port, void *addr, unsigned long count);

void insw(unsigned port, void *addr, unsigned long count);

void outsw(unsigned port, void *addr, unsigned long count);

void insl(unsigned port, void *addr, unsigned long count);

void outsl(unsigned port, void *addr, unsigned long count);

这些"字串函数"被优化为传送数据从一个输入端口到一个内存区或者其他的方式这些传送通过读或写到同一端口 count 次来完成.

#include <linux/ioport.h>

struct resource *request_region(unsigned long start, unsigned long len, char *name);

void release_region(unsigned long start, unsigned long len);

int check_region(unsigned long start, unsigned long len);

I/O 端口的资源分配器这个检查函数成功返回 并且在错误时小于 0.

struct resource *request_mem_region(unsigned long start, unsigned long len, char *name);

void release_mem_region(unsigned long start, unsigned long len);

int check_mem_region(unsigned long start, unsigned long len);

为内存区处理资源分配的函数

#include <asm/io.h>

void *ioremap(unsigned long phys_addr, unsigned long size);

void *ioremap_nocache(unsigned long phys_addr, unsigned long size);

void iounmap(void *virt_addr);

ioremap 重映射一个物理地址范围到处理器的虚拟地址空间使它对内核可用. iounmap 释放

映射当不再需要它时.

#include <asm/io.h>

unsigned int ioread8(void *addr);

unsigned int ioread16(void *addr);

unsigned int ioread32(void *addr);

void iowrite8(u8 value, void *addr);

void iowrite16(u16 value, void *addr);

void iowrite32(u32 value, void *addr);

用来使用 I/O 内存的存取者函数.

void ioread8_rep(void *addr, void *buf, unsigned long count);

void ioread16_rep(void *addr, void *buf, unsigned long count);

void ioread32_rep(void *addr, void *buf, unsigned long count);

void iowrite8_rep(void *addr, const void *buf, unsigned long count);

void iowrite16_rep(void *addr, const void *buf, unsigned long count);

void iowrite32_rep(void *addr, const void *buf, unsigned long count);

I/O 内存原语的"重复"版本.

unsigned readb(address);

unsigned readw(address);

unsigned readl(address);

void writeb(unsigned value, address);

void writew(unsigned value, address);

void writel(unsigned value, address);

memset_io(address, value, count);

memcpy_fromio(dest, source, nbytes);

memcpy_toio(dest, source, nbytes);

旧的类型不安全的存取 I/O 内存的函数.

void *ioport_map(unsigned long port, unsigned int count);

void ioport_unmap(void *addr);

一个想对待 I/O 端口如同它们是 I/O 内存的驱动作者可以传递它们的端口给 ioport_map. 

这个映射应当在不需要的时候恢复使用 ioport_unmap )

目录
相关文章
|
27天前
|
Linux 开发工具
【ZYNQ】配置嵌入式 Linux 静态 IP 地址
【ZYNQ】配置嵌入式 Linux 静态 IP 地址
|
27天前
|
网络协议 开发工具 Perl
【ZYNQ】裸机 PS + PL 双网口实现之 SDK 程序设计
【ZYNQ】裸机 PS + PL 双网口实现之 SDK 程序设计
|
1月前
|
Linux
Linux设备深探:桥接硬件与软件的秘密通道
在Linux的世界里,"设备"这个词汇比你想象的要丰富和多彩得多。让我们一起来探索Linux设备的奥秘,理解它们是如何在Linux操作系统中发挥作用的。🐧✨
Linux设备深探:桥接硬件与软件的秘密通道
|
7月前
|
Linux
嵌入式 Linux进程间的通信--信号
嵌入式 Linux进程间的通信--信号
|
7月前
|
消息中间件 Unix Linux
嵌入式 Linux进程之间的通信
嵌入式 Linux进程之间的通信
|
11月前
|
数据采集 自然语言处理 网络协议
Powerlink协议在嵌入式linux上的移植和主从站通信(电脑和linux板通信实验)
Powerlink协议在嵌入式linux上的移植和主从站通信(电脑和linux板通信实验)
|
数据处理 SoC Perl
ZYNQ与DSP之间EMIF16通信
介绍说明XQ6657Z35-EVM 高速数据处理评估板ZYNQ与DSP之间EMIF16通信的功能、使用步骤以及各个例程的运行效果。
ZYNQ与DSP之间EMIF16通信
|
传感器 定位技术 数据处理
ARM裸板开发——UART通信方式及使用(一)
ARM裸板开发——UART通信方式及使用
220 0
ARM裸板开发——UART通信方式及使用(一)
|
缓存 芯片
ARM裸板开发——UART通信方式及使用(二)
ARM裸板开发——UART通信方式及使用
170 0
【嵌入式】STM32通讯方式
【嵌入式】STM32通讯方式
79 0