現在、friendlyarm Linux 2.6.32.2(mini2440)用のGPIOカーネルモジュールを開発しています。私はエレクトロニクスのバックグラウンドを持ち、Linuxは初めてです。
起動時にロードされるカーネルモジュールと関連するデバイスファイルは、/dev
としてにありgpiofreq
ます。
デバイスファイルへの最初の書き込みでは、GPIOピンは50kHzで連続的にトグルします。2回目の書き込みでは、切り替えが停止します。3回目は、再開します。
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;
}