⑴ 求教linux下的gpio輸入驅動的一點問題
ker_buf[0] =gpio_get_value(LED_GPIO_1); //獲取管腳上的值
在這後面加一條printk語句,將ker_buf[0]的值列印出來,判斷讀取的值有沒有問題?
如果讀出來一直是0,那你就檢查IO口的配置有沒有問題!
if (_to_user(buf, ker_buf, 2)) //數據從內核空間往用戶空間的拷貝
return -EFAULT;
這條語句,你第一貼得代碼是2,後面那次是對的
⑵ 嵌入式Linux中如何實現應用程序與驅動程序函數介面問題,以GPIO為例
嵌入式Linux中如何實現應用程序與驅動程序函數介面問題,以GPIO為例
驅動中的函數定義:
static int sbc2440_leds_ioctl(
struct inode *inode,
struct file *file,
unsigned int cmd,
unsigned long arg)
{
switch(cmd) {
case 0:
case 1:
if (arg > 4) {
return -EINVAL;
}
s3c2410_gpio_setpin(led_table[arg], !cmd);
return 0;
default:
return -EINVAL;
}
}
應用程序中的函數定義:
ioctl(fd, on, led_no);
不明白的地方是函數名都不一樣,應用程序中的ioctl函數是如何將參數傳遞到驅動程序sbc2440_leds_ioctl中的?
xicain
⑶ 嵌入式linux中編寫驅動程序的時候用到的頭文件問題
#include <linux/mole.h> 模塊頭文件
#include <linux/kernel.h> 驅動要寫入內核,與內核相關的頭文件
#include <linux/fs.h> 文件系統頭文件
#include <linux/init.h> 初始化頭文件
#include <linux/delay.h> 延時頭文件
#include <asm/irq.h> 與處理器相關的中斷
#include <linux/interrupt.h> 操作系統中斷
#include <asm/uaccess.h> 與處理器相關的入口
//#include <asm/arch/regs-gpio.h> 與處理器相關的IO口操作
#include <mach/regs-gpio.h> 同上
//#include <asm/hardware.h> 與處理器相關的硬體
#include <mach/hardware.h> 同上
#include <linux/device.h> 設備驅動文件
#include <linux/poll.h> 輪詢文件
#include <linux/gpio.h> 操作系統相關的IO口文件
#include <stdio.h> 標准輸入輸出
#include <stdlib.h> 標准庫
#include <unistd.h>
#include <sys/ioctl.h> IO控制
以下6個是提供的函數中所需的頭文件
具體我也不詳
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/select.h>
#include <sys/time.h>
#include <errno.h>
⑷ 如何在Linux系統中直接操作GPIO
在一個老手的指導下,應用層可以直接操作GPIO,具體指設置GPIO的輸入輸出以及輸出電平高或者低。這個大大地提高了靈活性,官方的文檔有GPIO Sysfs Interface for Userspace,GPIO Sysfs。
這里我記錄一下使用過例子:
# RK30_PIN0_PD4
# A0-7 -> 0-7 / B0-7 -> 8-15 / C0-7 -> 16-23 / D0-7 -> 24-31
echo 28 > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio28/direction
echo 1 > /sys/class/gpio/gpio28/value
以上代碼作用是:將RK30_PIN0_PD4設置為輸出,將輸出電平設置為高電平。
⑸ linux中按鍵控制gpio燈的驅動程序怎麼寫。(自定義函數,gpio引腳)
這東西不是一兩句話能說得好的,建議先了解linux驅動程序編寫的框架,按照框架來,不用你自己來自定義函數,檢測按鍵按下是,對對應的GPIO管腳操作就可以了
⑹ gpio編程如何將程序
嘿嘿,那是當然了,STM32是32位單片機,51是8位機,兩者不是一個數量級的。
51單片機的I/O口就是I/O口,沒那麼多功能,
而STM32呢,它的GPIO口既可以做數字I/O,有些也可以做A/D,D/A,有些可以做SPI或者I2C對外通訊,還有些是做PWM脈寬輸出,功能各有不同。這些功能都需要實現配置好才能讓單片機知道你打算怎麼用這些口。51簡單死了,沒有A/D,D/A,沒有SPI通訊,也沒有PWM,就是I/O,每個口也只有那麼一個寄存器,直接讀寫就完了。
而到了32位機就不一樣了,那麼多功能,那麼多寄存器,如果不用庫的話,就要一位一位地把每個寄存器都設好,非常麻煩。ST專門給STM32編制了一個函數庫,所有的函數庫設置你只需要調用函數庫的函數就好。如果你英語還說得過去的話,看著函數庫就可以基本不用去每一位對寄存器了,犧牲了效率,但是非常非常的方便。
至於使用起來,也非常簡單,比如你要用GPIO,你就把STM32F10X_GPIO.C加到你的工程文件中去,然後在你在程序里引用一下#include "stm32f10x.h",就可以了。當然,我覺得這么做還要一個一個文件地想,到底需要不需要,乾脆把所有的C文件都加到工程里去,然後在編譯器里打開Level-2優化,這樣沒有用到的函數都不會被編譯到最終的hex文件中去了。想用到什麼函數都可以,非常方便的。
⑺ linux可以在用戶空間下控制gpio是怎樣實現的
簡單理解為:內核空間是內核使用,用戶空間是應用程序使用;除非編譯內核要考慮內核空間,其餘情況都可以按照用戶空間處理
⑻ linux下通過GPIO仿時鍾,引腳只拉高拉低一次,後續置位、復位操作貌似沒有執行
CPU執行指令的速度和寫GPIO的速度相差太大, 你就算模擬時鍾,也應該在每個寫IO的指令之間加個延時吧?
⑼ 在linux內核的arm開發板上寫驅動需要做什麼
先保證會寫x86的linux驅動(即掌握驅動編程)
了解arm開發板的CPU管腳連接(了解GPIO接法)
把x86的linux驅動中,對應的管腳改成arm的管腳就可以了。
使用嵌入式gcc進行編譯
會把編譯產物燒寫到arm板中
會給arm板加電啟動