我发现内核中的GPIO驱动程序留下/sys/class/gpio来控制gpio,但我发现GPIO也可以被控制/dev/mem,我发现这个映射可能在spi-bcm2708(它调用__ioremap作为平台驱动程序)中完成,但我不这样做了解spi和GPIO之间的关系,它们在linux中如何协同工作?
OV5640 相机的Linux 驱动程序提供了有限的功能。
static struct i2c_driver ov5640_i2c_driver = {
.driver = {
.name = "ov5640",
.of_match_table = ov5640_dt_ids,
},
.id_table = ov5640_id,
.probe = ov5640_probe,
.remove = ov5640_remove,
};
Run Code Online (Sandbox Code Playgroud)
这些功能是name、probe和remove。
我对驱动程序不是很熟悉,但我找不到渲染像素的驱动程序的任何部分,因此我可以将它们存储到数组中。我也找不到任何用于读取像素的虚拟内存地址。
捕获的图像数据传输发生在代码的哪一部分?我正在寻找两个位置:一个在驱动程序中,一个在调用驱动程序的更高级别。
我目前正在学习 C,所以我想制作一个程序,要求用户输入一个字符串并输出输入的字符数,代码编译得很好,当我只输入 1 个字符时,它就可以了,但是当我输入2个或更多字符,无论我输入多少个字符,它总是说只有一个字符,然后就崩溃了。这是我的代码,我不知道出了什么问题。
int main(void)
{
int siz;
char i[] = "";
printf("Enter a string.\n");
scanf("%s", i);
siz = sizeof(i)/sizeof(char);
printf("%d", siz);
getch();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我目前正在学习编程,所以如果有一种方法可以使用相同的 scanf() 函数来完成它,我会很感激,因为我还没有学会如何使用任何其他函数,并且可能不会理解它是如何工作的。
我需要每5毫秒读取一次BBB中的所有7个模拟引脚。我正在使用以下C代码进行此操作:
void main(){
char value_str[7];
long int value_int = 0;
FILE* f0 = fopen("/sys/bus/iio/devices/iio:device0/in_voltage0_raw", "r");
while(1){
fread(&value_str, 6, 6, f0);
value_int = strtol(value_str,NULL,0);
printf("0 %li\n", value_int);
fflush(stdout);
usleep(5000);
rewind(f0);
}
Run Code Online (Sandbox Code Playgroud)
但是,CPU使用率确实很高(20%)。有什么方法可以以不同的方式读取模拟输入,从而不会占用太多CPU?有人建议使用“ DMA”,但我在这方面完全迷失了……
任何帮助将不胜感激。
我有点堆栈与内核符号类型的含义.简单的静态符号与C static具有相同的含义.因此局部静态变量具有局部范围和静态分配.静态函数作用域是一个文件.但静态导出符号呢?如何应对EXPORT_SYMBOL(),EXPORT_PER_CPU_SYMBOL(),EXPORT_UNUSED_SYMBOL()如果宏观出口静态符号?全局符号和导出符号有什么区别?链接器是否有责任为导出的符号添加其他信息?全局静态变量内置内核是否在所有内核和可加载模块中都可见?
可以从可加载模块访问内核导出的符号.内核中的这种符号是否很好用?当内核解析符号时,它是通过内核符号表进行查找的吗?
我被告知每个STM32F103RET设备都带有一个唯一的设备ID.如果检索ID的过程是什么?我正在运行一个系统,其中我与多个STM borads进行通信.为了区分每个STM板,我可以使用这个唯一的Id.谢谢
我真的不明白fork()是如何工作的.我理解一个fork的例子,但是当我有多个调用时,我没有.我有一个这样的例子,它打印4行hello,有多少个进程是产生的?
int main(void)
{
fork();
fork();
printf("hello\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我的USB触摸屏连接到我的硬件设置.当我使用时,cat /proc/bus/input/devices我得到有关我的设备的以下详细信息:
I: Bus=0003 Vendor=2965 Product=5023 Version=0110
N: Name="Kortek Kortek Touch"
P: Phys=usb-0000:00:14.0-3.4/input2
S: Sysfs=/devices/pci0000:00/0000:00:14.0/usb3/3-3/3-3.4/3-3.4:1.2/0003:2965:5023.0006/input/input7
U: Uniq=S20131028
H: Handlers=mouse1 event7 js0
B: PROP=0
B: EV=1b
B: KEY=30000 0 0 0 0 0 0 0 0
B: ABS=3
B: MSC=10
Run Code Online (Sandbox Code Playgroud)
我想知道这条线S: Sysfs=/devices/pci0000:00/0000:00:14.0/usb3/3-3/3-3.4/3-3.4:1.2/0003:2965:5023.0006/input/input7意味着什么.怎么看?路径中的数字是多少?
我试图了解ARM体系结构的DMA内部,参考内核文档:http://lxr.free-electrons.com/source/Documentation/DMA-API-HOWTO.txt.
我的理解是我们在内核空间中分配内存(使用DMA约束)并将其传递给dma_map_single()函数,该函数将根据DMA需要更改内存的映射属性(写入组合或非高速缓存).然后,如果平台支持IOMMU,它将返回设备总线的虚拟地址,否则它将返回可以直接从设备访问的物理地址.
这是正确的理解吗?
目前,我无法映射它的源代码,任何带有代码片段的指针都会非常有用.
我有两个设备通过串行端口相互连接。一个作为主人,另一个作为奴隶。
主设备是一个基于 ARM 的套件,运行 Linux。
目前的情况是master发送命令然后轮询com端口直到slave回复。
现在我不想使用轮询。我需要处理器执行其他任务,直到从机回复。
我知道解决方案是使用中断,但找不到更多详细信息。我找到了一些使用信号的解决方案。它以非阻塞模式读取 tty,然后在数据准备好时发送 io 信号。
那么,串行通信中中断和信号有什么区别呢?当使用中断时我应该编写设备驱动程序或内核模块等吗?为了不使用轮询,还有其他有效的解决方案吗?