Articles of embedded式linux

读取串口块不明原因

我正试图在Linux下使用termios框架来通过UART(usbserial)接口非接触式智能卡读卡器。 这个代码可以在PC上正常工作,但是当我在ARM9目标上交叉编译并试用时,它能够打开设备甚至将命令写入设备,但是读取命令无限期地被阻塞。 这里是代码片段: int mifare_rdr_init(struct mifare_1K * ptr, char *rdr_devnode) { bzero(ptr, sizeof(struct mifare_1K)); // zero the entire structure // open serial device int fd = open(rdr_devnode, O_RDWR|O_NOCTTY ); if (fd == -1) { perror("Failed to open serial device "); return 1; } ptr->serialfd = fd; // save file descriptor ptr->serialdev.c_iflag = 0; // no […]

是什么时候在ISR计划之后运行tasklet?

我写了我的ISR,我的tasklet立即运行。 但是 ,我看到有人说tasklet只有在CPU受到关注时才运行。 这是一个非常通用的术语CPU注意,所以我背诵这些响应者。 我的意思是在哪个时刻CPU注意到tasklet的执行和CPU状态发生了什么? 其次,如果假设我继续进行硬中断,那么tasklet有机会运行的时候呢? tasklet可能没有机会运行吗? 内核如何处理这些事情?

如何在启动过程后切换linux内核控制台?

在我的embedded式系统上,我通常使用/ dev / ttyS0作为主控制台。 这是通过传递内核参数console=/dev/ttyS0 ,当init接受它的一部分时, getty将在例如inittab指定的同一个设备上被触发。 ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 。 有没有可能改变这些设置而不重新启动,并切换到另一个terminal如ttyS1 , ttyUSBx甚至一些伪tty?

如何在linux中知道特定引脚的中断/ GPIO编号

我正在做一个项目,我需要在Linux中处理一个中断。 我使用的主板是基于三星s3c6410 MCU的ARM9Board(arm 11处理器),它具有以下I / O接口: 如图所示,我有EINTx引脚的外部中断和GPxx引脚作为GPIO引脚,我不介意使用其中任何一个,但我没有他们的号码! 对于EINTx引脚: 当我打电话 int request_irq(unsigned int irq, void (*handler)(int, struct pt_regs *), unsigned long flags, const char *device); 我需要中断号作为函数的第一个parameter passing它,所以如何获得irq号码,例如EINT16引脚? 对于GPxx引脚:同样的故事,我需要GPIO引脚编号将它传递给这些function int gpio_request(unsigned gpio, const char *label); int gpio_direction_input(unsigned gpio); int gpio_to_irq(unsigned gpio); 即我如何知道GPP8引脚的GPIO号码? 我search了董事会的文件和数据表,但它不包含任何关于如何获得这些数字,任何想法或帮助在哪里看?

从内核空间closures(embedded)Linux

我正在为基于ARM9的平台Olinuxino开发2.6.35内核的修改版本。 我正在尝试修改电源pipe理驱动程序(体系结构特定部分)。 处理器是飞思卡尔i.MX23。 该处理器有一个称为PSWITCH的“特殊”引脚,触发一个由电源pipe理驱动程序处理的中断。 如果按下开关,则系统进入待机状态。 这是通过调用pm_suspend(PM_SUSPEND_STANDBY)在驱动程序中完成的。 鉴于我的硬件设置,我想,而是closures系统。 所以我的问题是: 内核空间进程触发一个干净的系统停止/关机的首选方式是什么? 我想这里有一个很好的小函数,但是到目前为止我找不到它。 我的内核代码(我正在使用的文件是arch / arm / mach-mx23 / pm.c)可以在这里find: github.com/spairal/linux-for-lobster ,虽然我的问题需要一个通用的Linux内核做法。

/ proc / iomem的内容

1)是否可以访问/ proc / iomem中未定义的物理地址? 2)如果设备的物理地址范围没有出现在/ proc / iomem中,是否表示设备尚未被使用/初始化?

用户空间与内核空间驱动程序

我期待写一个PWM驱动程序。 我知道有两种方法可以控制硬件驱动程序: 用户空间驱动。 内核空间驱动程序 如果一般情况下(不考虑PWM驱动的情况下),我们必须决定是否去用户空间或内核空间驱动程序。 那么除了这些因素,我们还要考虑哪些因素呢? 用户空间驱动程序可以直接将mmap()/ dev / mem内存映射到其虚拟地址空间,不需要上下文切换。 用户空间驱动程序不能实现中断处理程序(它们必须轮询中断)。 用户空间驱动程序不能执行DMA(因为可以从内核空间分配DMA的内存)。

内核函数asm_do_IRQ()中的irq与我在模块中请求的不同

我用cortex-A9开发板做了一些实验。 我用gpio_to_irq()来获得一个irq num,并且我请求了irq,并用它写了一个小的驱动程序,在syslog中是196。 我在asm_do_IRQ中添加了一些printks。 当我触发gpio中断时,驱动程序工作正常,但是asm_do_IRQ中的irq num是62,我不明白。 为什么irq号码与我要求的不一样? 司机如下: #include <linux/module.h> #include <linux/interrupt.h> #include <linux/irq.h> #include <linux/gpio.h> #define GPIO_N 36 //gpio number int flag = 0; static irqreturn_t handler(int irq,void *dev_id) { printk("hello world hahahahahhahahah \n\n"); return 0; } static int __init gpio_test_init(void) { if(gpio_request_one(GPIO_N,GPIOF_DIR_IN,"some test")<0) { printk(KERN_ERR "Oops! BAD! BAD! BAD!\n\n"); return 0; } int […]

为什么arm-linux-gnueabi-g ++-4.4总是build立一个“7-A”二进制文件?

我正在运行Ubuntu 12:04LTS并安装了arm-linux-gnueabi C和C ++编译器。 编译后的二进制文件不能在我的目标板上运行。 看起来即使我指定了cpu和arch,编译器仍然为错误的CPU构build了一个二进制文件。 而不是atm9tdmi它build立和7-A。 我做错了什么,或者有什么我应该configuration? 谢谢。 ~/ArmTest$ arm-linux-gnueabi-g++-4.4 -mcpu=arm9tdmi -march=armv4t -O main.cpp -o CPPTest ~/ArmTest$ readelf -A CPPTest Attribute Section: aeabi File Attributes Tag_CPU_name: "7-A" Tag_CPU_arch: v7 Tag_CPU_arch_profile: Application Tag_ARM_ISA_use: Yes Tag_THUMB_ISA_use: Thumb-2 Tag_FP_arch: VFPv3-D16 Tag_ABI_PCS_wchar_t: 4 Tag_ABI_FP_denormal: Needed Tag_ABI_FP_exceptions: Needed Tag_ABI_FP_number_model: IEEE 754 Tag_ABI_align_needed: 8-byte Tag_ABI_align_preserved: 8-byte, except leaf SP Tag_ABI_enum_size: […]