(linux自学笔记)linux环境下GPIO字符驱动

发布时间:2024-09-23  

linux环境下驱动包括三类:字符设备驱动,块设备驱动,网络设备驱动。


linux的驱动程序,可以编写成模块,加载到内核中。


linux的操作设备,是以文件的形式。


简单的IO口驱动,driver_led.c文件:


#include   

#include   

#include   

#include /* copy_to_user,copy_from_user */  

#include     

#include     

#include     

#include     

#include     

#include   

  

#define LED_MAJOR 240  

  

int led_open (struct inode *inode,struct file *filp)  

  

{  

    unsigned tmp;     

    tmp = readl(S3C64XX_GPMCON);     

    tmp &= 0xffff0000;     

    tmp |= 0x00001111;

    writel(tmp, S3C64XX_GPMCON);   

    writel(0xffffffff, S3C64XX_GPMDAT);

    printk('open ledn');  

    return 0;  

}  

  

ssize_t led_read (struct file *filp, char __user *buf, size_t count,loff_t *f_pos)  

{  

    return count;  

}  

  

  

ssize_t led_write (struct file *filp, const char __user *buf, size_t count,loff_t *f_pos)  

{  

    char wbuf[1];  

    unsigned tmp;     


    copy_from_user(wbuf,buf,count);  

    

    tmp = readl(S3C64XX_GPMDAT);

    tmp &= 0xfffffff0;

    tmp |= wbuf[0]; 

    writel(tmp, S3C64XX_GPMDAT);

    //writel(0x02,S3C64XX_GPMDAT);

    return count;  

}  

  

int led_release (struct inode *inode, struct file *filp)  

{  

    return 0;  

}  

  

struct file_operations led_fops ={  

    .owner = THIS_MODULE,  

    .open = led_open,  

    .read = led_read,  

    .write = led_write,  

    .release = led_release,  

};  

  

int __init led_init (void)  

{   int rc;  

    printk ('led initn');  

    rc = register_chrdev(LED_MAJOR,'led',&led_fops);  

    if (rc <0)  

    {  

        printk ('register %s char dev errorn','led');  

        return -1;  

    }  

    printk ('successn');  

    return 0;  

}  

  

void __exit led_exit (void)  

{  

    unregister_chrdev(LED_MAJOR,'led');  

    printk ('module exitn');  

    return ;  

}  

  

module_init(led_init);  

module_exit(led_exit);  


编写makefile文件


all: install cp clean


obj-m := driver_led.o

KDIR := /forlinux/linux-3.0.1/


install:

make -C $(KDIR) M=$(shell pwd) modules

cp:

cp driver_led.ko /mnt/share/

clean:

make -C $(KDIR) M=$(shell pwd) clean


编译生成的driver_led文件复制到 /mnt目录下(共享)。


led_test.c 简单的流水灯测试程序


#include   

#include   

#include   

#include   

int main (void)  

{  

    int fd;  

    char buf[4]={~0x01,~0x02,~0x04,~0x08};  

    fd = open('/dev/my_led',O_RDWR);  

    if (fd < 0)  

    {  

        printf ('Open /dev/my_led file errorn');  

        return -1;  

    }     

    while(1)

    {

        write(fd,&buf[0],1);  

        sleep(1);  

        write(fd,&buf[1],1);  

        sleep(1);

        write(fd,&buf[2],1);

        sleep(1);

        write(fd,&buf[3],1);

        sleep(1);

    }  

    return 0;  

  

}  


编译后,生成文件复制到目标机。


运行命令:


加载驱动模块


insmod driver_led.ko


建立驱动文件

mknod /dev/my_led c 240 0


运行调试程序

./led_test


LED流水灯。


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>