嵌入式LINUX驱动学习之14软硬件分离编程(二)代码举例
一、硬件信息配置
include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
struct resource led_src_B[] = {
{
.start = 0XC001B000,
.end = 0XC001B000 + 0X24,
.flags = IORESOURCE_MEM
},
{
用于保存GPIO号
.start =26 ,
.end =26 ,
.flags = IORESOURCE_IRQ
}
};
static void dd_close(struct device *dev){
}
static struct platform_device btn_led_dev= {
.name = "LED_",
.id = 1,
.dev = {
.release = dd_close
},
.num_resources = 2,
.resource = led_src_B
};
static int btn_led_dev_init(void){
platform_device_register(&btn_led_dev);
return 0;
}
static void btn_led_dev_exit(void){
platform_device_unregister(&btn_led_dev_3);
}
module_init(btn_led_dev_init);
module_exit(btn_led_dev_exit);
MODULE_LICENSE("GPL");
二 、软件驱动代码:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/io.h>
void * ioremap_ret ;
unsigned long *base;
unsigned long *outenb;
unsigned long *altfn;
int myprobe(struct platform_device * pl_reg){
struct resource *phy_src = platform_get_resource(pl_reg,IORESOURCE_MEM,0);
struct resource *gpio_src = platform_get_resource(pl_reg,IORESOURCE_IRQ,0);
ioremap_ret = ioremap((phy_src ->start),0x24);
base = (unsigned long *) ioremap_ret;
*base &= ~(0x1 << gpio_src ->start);
outenb = (unsigned long *) (ioremap_ret + 0x4);
*outenb |= (0x1 << gpio_src -> start);
if(gpio_src->start < 15){
altfn = (unsigned long *) (ioremap_ret + 0x20);
*altfn &= ~(0x3 << (gpio_src ->start * 2));
*altfn |= (0x1 << (gpio_src ->start * 2));
}
else {
altfn = (unsigned long *) (ioremap_ret + 0x24);
*altfn &= ~(0x3 << ((gpio_src -> start - 16) * 2));
*altfn |= (0x1 << ((gpio_src -> start - 16) * 2));
}
return 0;
}
int myremove(struct platform_device *pl_rem){
struct resource *phy_src = platform_get_resource(pl_rem,IORESOURCE_MEM,0);
struct resource *gpio_src = platform_get_resource(pl_rem,IORESOURCE_IRQ,0);
ioremap_ret = ioremap(phy_src ->start,0x24);
base = (unsigned long *) ioremap_ret;
*base |= (0x1 << gpio_src -> start);
return 0;
}
struct platform_driver bl_pd = {
.probe = myprobe,
.remove = myremove,
.driver = {
.name = "LED_"
}
};
static int btn_led_init(void){
platform_driver_register(&bl_pd);
return 0;
}
static void btn_led_exit(void){
platform_driver_unregister(&bl_pd);
}
module_init(btn_led_init);
module_exit(btn_led_exit);
MODULE_LICENSE("GPL");