目前,我正在为FriendlyArm Linux 2.6.32.2(Mini2440)开发GPIO内核模块。我来自电子背景,新来的Linux。

在启动时加载和相关设备文件的内核模块位于 /dev 作为 gpiofreq.

在第一次写入设备文件时,GPIO PIN在50kHz处连续切换。第二次写作停止切换。第三次,它再次开始,依此类推。

我已经编写了单独的内核模块来生成FREQ。但是CPU首次编写设备文件后冻结。显示终端提示,但之后我无法运行任何命令。

这是代码刺:

//calling function which generates continuous freq at gpio

static int send_freq(void *arg)
{
    set_current_state(TASK_INTERRUPTIBLE);
    for(;;)
    {
        gpio_set_value(192,1);
        udelay(10);
        gpio_set_value(192,0);
        udelay(10);
    }
    return 0;
}

这是设备写代码,该代码从编写到设备文件的任何数据开始或停止。

if(toggle==0)
{
       printk("Starting Freq.\n");
       task=kthread_run(&send_freq,(void *)freq,"START");
       toggle=1;
}
else
{
       printk("Operation Terminated.\n");
       i = kthread_stop(task);
       toggle=0;
}
有帮助吗?

解决方案

您在内核线程中进行无限循环,除了IRQ甚至其他内核线程外,没有其他任何事情发生。

你能做的就是

  • 在硬件上编程计时器,并在中断中进行销售

  • 用usleep_range替换udelay

我建议逐步做某事,从usleep_range开始在KHz范围内,最终转移到Cust OM Timer + ISR

无论哪种情况,您都可能会有很多抖动,并且在DSP或PIC上进行此类GPIO进行切换可能是一个好主意,但是除非您对PWM有帮助的GPIO有帮助,否则ARM + Linux的资源浪费了引擎。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top