LED驱动

声明:本人初学驱动,水平有限,本博客用于自己的学习总结,可能很多地方说的不准确,如有错误之处,还请大家指教和谅解。
平台:三星s3c2440
虚拟机:Fodera
下面根据一个简单的LED驱动讲述一个驱动的简单模型及其LED应用程序怎么么调用LED驱动程序的。
代码实现:在应用程序中执行./led arg 0 实现第arg(可以是0、1、2、3)个灯亮,执行./led arg 1实现循环流水灯
驱动程序
int led_gpio_table[]={
S3C2410_GPB(5),
S3C2410_GPB(6),
S3C2410_GPB(7),
S3C2410_GPB(8),
};
int led_cfg_table[]={
S3C2410_GPIO_OUTPUT,
}; //2440中对应的引脚和配置
static int led_drv_ioctl(struct inode * node, struct file *file, unsigned int cmd, unsigned int arg)
{
if(arg<4&&arg>=0){
printk(“start ioctl…”);
switch(cmd){
case 0:
s3c2410_gpio_setpin(led_gpio_table[arg],cmd);
break;
case 1:
{
int i;
for( i=0;i<4;i++){
s3c2410_gpio_setpin(led_gpio_table[i],!cmd);
mdelay(500);
s3c2410_gpio_setpin(led_gpio_table[i],cmd);
}
}break;
default :
return -1;
}
}
else
return -1;
}

static struct file_operations led_drv_ops={
.owner=THIS_MODULE,
// .open=led_drv_open,
.ioctl=led_drv_ioctl, //这里的led_drv_ioctl对应应用程序中的ioctl.
};
int led_init(void) //初始化LED
{
printk(“led_init!”);
register_chrdev(2,”led_drv”,&led_drv_ops);//这里注册LED,chrdev()中第一个参数是设备号(重要),第二个是设备名,第三个是跟c库有关的结构体(必不可少)
int i;
for(i=0;i<4;i++)
{
s3c2410_gpio_cfgpin(led_gpio_table[i],led_cfg_table[0]);
}
return 0;
}
void led_exit(void)
{
printk(“led_exit!”);
unregister_chrdev(2,”led_drv”);
}
module_init(led_init); //内核从这里加载LED驱动模块,从这里跳转到led_init
module_exit(led_exit); //从这里卸载
MODULE_LICENSE(“GPL”);
这里要说的是(1):应用程序怎么找到底层的驱动程序的?
根据设备属性和设备号(可以通过cat /proc/devices查看板子上挂载的设备和设备号)
(2):应用程序的执行动作和驱动程序中的执行动作怎么关联?
根据 struct file_operations 这个结构体。这个结构体实现应用程序文件操作与驱动程序文件操作函数的“”握手“”。
在很多程序中全局定义的结构体,可以用于函数或线程之间数据的存储、访问、交换。
应用程序
int main(int argc,char **argv)
{
printf(“led_app is booting…”);
int led,nf,fd;
if(argc<4&&argc>=0){
sscanf(argv[1],”%d”,&led);
sscanf(argv[2],”%d”,&nf);
fd=open(“/dev/led”,0);
if(fd<0){return -1;}
else
while(1){
ioctl(fd,nf,led); //这里对应驱动的 led_drv_ioctl
}
}
else
return -1;
}
具体操作:
1.驱动程序(/work/led/led_drv.c):
在驱动程序的目录下(包含自身的Makefile文件)执行
make
生成led_drv.ko文件,拷贝到开发板(/work/led/drv/)下;
2.应用程序(/work/led/led_app.c):
编译应用程序led_app.c,生成led_app应用程序
arm-linux-gcc led_app.c -o led_app
拷贝led_app到开发板上(/work/led/app/)
3.加载驱动 insmod led_app.ko
挂载设备 mknod /dev/led c 2 0 //这里的属性是字符设备,设备号2跟前面驱动程序注册 register_chrdev(2,”led_drv”,&led_drv_ops);是关联的。
查看已挂载的设备ls -la /dev/led
4.执行在(/work/led/app/)下执行./led 1 0或./led 1 1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值