一、開發環境
1、硬體平台:fs2410
2、主機:ubuntu 10.10
3、核心版本:linux 2.6.35
4、交叉編譯工具鏈:arm-none-linux-gnueabi-
二、詳細**
led_device.c:
#include #include #include #include #include struct resource led_resource =
};struct platform_device led_device = ;
static int __init led_device_init(void)
static void __exit led_device_exit(void)
module_init(led_device_init);
module_exit(led_device_exit);
module_author("yhr");
module_license("gpl");
led_driver.c
#include #include #include #include #include #include #include #include #include #include #include static volatile unsigned int *gpfcon;
static volatile unsigned int *gpfdat;
void init_led(void)
static int led_open(struct inode *inode, struct file *filp)
static int led_release(struct inode *inode, struct file *filp)
static ssize_t led_read(struct file *filp, char __user *buf, size_t size, loff_t *ppos)
static ssize_t led_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)
static struct file_operations led_fops = ;
struct miscdevice led_dev = ;
static int led_probe(struct platform_device *pdev)
size = resource_size(res);
led_mem = request_mem_region(res->start, size, pdev->name);
if(led_mem == null)
gpfcon = ioremap(res->start, size);
gpfdat = ioremap(res->end, size);
return ret;
}static int led_remove(struct platform_device *pdev)
size = resource_size(res);
iounmap(gpfcon);
iounmap(gpfdat);
release_mem_region(res->start, size);
misc_deregister(&led_dev);
return 0;
}struct platform_driver led_driver = ,
};static int __init led_driver_init(void)
static void __exit led_driver_exit(void)
module_init(led_driver_init);
module_exit(led_driver_exit);
module_author("yhr");
module_license("gpl");
makefile:
ifeq ($(kernelrelease),)
# set your object kernel dir
kerneldir = /home/linux/linux-2.6.35
pwd := $(shell pwd)
modules:
$(make) -c $(kerneldir) m=$(pwd) modules
modules_install:
$(make) -c $(kerneldir) m=$(pwd) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions module* modules*
.phony: modules modules_install clean
else
obj-m := led_device.o led_driver.o
endif
應用測試程式(led_test.c):
#include #include #include #include int main(void)
while(1);
return 0;
}
linux驅動之platform裝置驅動實驗
platform機制 把硬體相關的 固定的,如板子的網絡卡 中斷位址 和驅動 會根據程式作變動,如點哪乙個燈 分離開來,即要編寫兩個檔案 dev.c和drv.c platform裝置和platform驅動 platform會存在 sys bus 裡面,如下圖所示,platform目錄下會有兩個檔案,...
platform裝置驅動
platform bus是一種虛擬匯流排,作用就是將裝置資訊和驅動程式進行分離,platform bus會維護兩條線,一條是裝置,一條是驅動。當乙個裝置被註冊到匯流排上面的時候,匯流排會去搜尋對應的驅動,反之如果驅動被註冊到匯流排,匯流排也會去找對應的驅動。描述裝置資訊的方式有2種,一種是通過手動填...
Linux裝置驅動開發之Platform匯流排裝置
1.linux 裝置模型 裝置 device 裝置板級資訊描述 描述裝置硬體資訊,主要是裝置樹開發 驅動 driver 裝置驅動程式 不依賴板級資訊的裝置驅動程式 匯流排 bus 負責管理掛載對應匯流排的裝置以及驅動 常用platform 匯流排 spi匯流排 i2c匯流排,負責裝置和驅動的匹配 類...