我正在尝试按照教程在Linux中创建自定义USB驱动程序,我希望在使用g ++的Ubuntu Eee的Eee PC上开发这个东西.不幸的是,按照教程我需要linux/module.h头文件.根据我的理解,我将需要编译内核以使其工作.我以前从未编译过内核,我发现的所有指令都是针对桌面Ubuntu的.
我在我的Eee上这样做,因为如果我能在课堂上使用它并在课堂项目中使用它,我会在课堂上获得额外的学分.
我关注的教程如下:http://www.linuxjournal.com/article/7353 ,在这里:http://www.linuxjournal.com/article/4786
我有一个名为的内核模块mymodule,我有:
static struct file_operations my_mod_fops = {
.owner = THIS_MODULE
.write = my_write,
.open = my_open,
.unlocked_ioctl = my_ioctl,
.read = my_read,
};
Run Code Online (Sandbox Code Playgroud)
测试了前一个结构中映射的所有函数,它们都没问题.我想声明全局(并且静态地,如果可用)一个char kernel_array[128],我想编写一个可以执行此操作的用户空间应用程序:
int main(){
char* ptr_to_kernel_arr = get_kernel_array_address();
for (int i=0 ; i<128;++i)
*(ptr_to_kernel_arr+i) = i;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的困难是:
如何获取kernel_array[128]可以从用户空间应用程序分配值的地址?
内核如何知道其lsmod列表中的哪个模块拥有该模块kernel_array
如何处理mmap所有这些情况?
我正在尝试编写一个将安装在Linux MCU(Raspberry Pi)上的程序,该程序将读取从另一个MCU(我将自己构建的本地产品)的串行数据.
我已经研究过如何做到这一点,并认为我有"大局",但仍然缺少一些东西.首先,我需要启用内核模块并让自己访问设备:
sudo modprobe spi_bcm2708
sudo chown `id -u`.`id -g` /dev/spidev0.*
Run Code Online (Sandbox Code Playgroud)
从那里我可以使用这个着名的C文件来测试SPI连接.
所以现在连接就在那里,但我仍然需要从中读取串行数据.根据这个问题的答案,我只需要:
...打开相关端口进行读取,并用于
read()获取数据.
然而,该答案中的代码片段似乎是通过设备驱动程序而不是通过SPI打开端口.
我的理解是,我可以使用SPI从所连接的MCU设备读取数据,而且我会不会需要写我自己的设备驱动程序为该设备.这是真的?如果是这样,我将如何从SPI连接中读取,以及该代码与上面链接的问题的答案中的代码有何不同?
如果我的理解不正确,并且我确实阅读了"通过"设备驱动程序,为什么我首先需要驱动程序?这不是SPI希望规避的吗?提前致谢.
请告诉我是否有任何API,系统调用,功能(在Linux中),我可以使用我的C程序动态检测COM端口,即,只要在端口中插入USB调制解调器加密狗,我就能检测到COM端口在我的C程序中使用API,系统调用或函数.
1)是否可以访问/ proc/iomem中未定义的物理地址?
2)如果设备的物理地址范围没有出现在/ proc/iomem中,是否意味着该设备尚未被使用/初始化?
我正在研究rasberry pi板.是否可以使用inb(),outb()...?直接从linux内核空间访问GPIO物理地址.如果是的话怎么样?
GPIO寄存器地址链接Page 90 http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf
谢谢
linux embedded linux-device-driver linux-kernel embedded-linux
我已经开始学习linux设备驱动程序了.我正在做一些示例程序作为我学习的一部分.为了理解内存映射IO,我编写了以下代码.(这里只显示了init).基地址没有硬件映射.
static unsigned long base = 0xfed00000;
unsigned long device_base=0;
unsigned long virtual_base=0;
static int __init sharedirqmodule_init(void) {
u32 register1=0;
u32 value=0x23456789;
device_base=base;
void *address=0;
if(!request_mem_region(device_base,8,"device"))
return -ENODEV;
virtual_base = (unsigned long) ioremap(device_base, 8);
address=(void *)virtual_base;
printk(KERN_ERR "Sharedirq : Address value: %lx\n",address);
iowrite32(value,address);
wmb();
register1=(u32)ioread32(address);
rmb();
printk(KERN_ERR "Shared irq :value: %d \n",register1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该模块是insmod'ing.但是我在使用ioread32时没有得到正确的值.我得到以下输出,
[20441.627344] Sharedirq : Address value: ffffc900001ce000
[20441.627365] Shared irq :value: -1
Run Code Online (Sandbox Code Playgroud)
该计划出了什么问题?如果错误是愚蠢的,我将不胜感激而不是直接的解决方案.(抱歉为同一个值使用多个变量.. virtual_base和地址)
任何人都可以解释rcu_dereference()和之间的区别是rcu_dereference_protected()什么?
rcu_dereference()包含障碍代码,rcu_dereference_protected()不包含.
何时使用rcu_dereference()以及何时使用rcu_dereference_protected()?
我试图安装imwheel,这是Linux的鼠标配置客户端,当我尝试安装软件包时遇到此输出时,我陷入了困境,就像我以前做过的,但从未遇到过这个问题(我曾经使用过pacaur);
eman@alexandria ~
[17:38:40]
> $ yaourt imwheel
1 aur/imwheel 1.0.0pre12-5 (15) (1.41)
Mouse wheel configuration tool for XFree86/Xorg
==> Enter n° of packages to be installed (e.g., 1 2 3 or 1-3)
==> ---------------------------------------------------------
==> 1
==> Downloading imwheel PKGBUILD from AUR...
x .SRCINFO
x PKGBUILD
x etcdir-install.patch
Zeph commented on 2017-12-05 20:38
imwheel 1.0.0pre12-5 (2015-08-14 12:11)
( Unsupported package: Potentially dangerous ! )
==> Edit PKGBUILD ? [Y/n] ("A" to abort)
==> ------------------------------------
==> y
==> imwheel dependencies: …Run Code Online (Sandbox Code Playgroud) 我的目标是将此驱动程序移植到当前的Linux内核上。我到目前为止所做的事情...
1)下载了当前内核版本的源代码。
2)下载了dev_parallel.c,Makefile,Kconfig以便重新编写代码。
3)使用“ make”命令,我能够正确编译驱动程序。
4)使用“ make modules”命令,我可以生成一个.o文件。
5)使用“ make modules_install”命令,我可以得到.ko文件。
6)使用“ modprobe”命令,我可以成功加载模块,而不会出现内核崩溃。
但是,我看到有该驱动程序所在的文件DTS 这里。我知道dts文件被编译为dtb文件,内核在启动时会读取它们,它会自动加载模块。
但是是否有必要拥有这个DTS文件,或者仅modprobe命令可以为我完成这项工作?
我在说的驱动程序是用于电子纸显示器(EPD)的。
因此,如果我连接EPD,然后执行modprobe来加载驱动程序,它将正常工作还是我需要DTS文件才能使其正常工作?
device-driver linux-device-driver linux-kernel device-tree beagleboneblack
linux ×7
linux-kernel ×6
c ×3
c++ ×2
embedded ×2
memory ×2
archlinux ×1
device-tree ×1
io ×1
rcu ×1
serial-port ×1
spi ×1
ubuntu ×1
udev ×1