資源簡介
資源對應博客: https://blog.csdn.net/Ningjianwen/article/details/87923875
代碼片段和文件信息
#include???//定義了THIS_MODULE宏
#include???????//定義了file_operations結構體
#include????//定義了copy_to_user函數
#include?????????//定義了ioremap?與iounremap函數
#include???//定義了class_create/device_create/class_destory/device_destory函數
???????????????????????????//定義了class?與?class_device結構體
#include?//包含了GPIO相關宏
#include?????//包含了s3c2410_gpio_cfgpin等io操作函數
#define?LED_NUM?3
static?struct?class?*leddrv_class;
static?struct?class_device *leddrv_class_dev;
/**應用程序的open函數時最終會調用該函數配置LED控制引腳為輸出*/
static?int?led_drv_open(struct?inode?*inode?struct?file?*file)
{
s3c2410_gpio_cfgpin(S3C2410_GPF(4)S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPF(5)S3C2410_GPIO_OUTPUT);
s3c2410_gpio_cfgpin(S3C2410_GPF(6)S3C2410_GPIO_OUTPUT);
return?0;
}
/**應用程序的read函數時最終會調用該函數*/
ssize_t?led_drv_read(struct?file?*file?char?__user?*buf?size_t?size?loff_t?*ppos)
{
unsigned?char?led_vals[LED_NUM];
if?(size?>?LED_NUM?||?size?0)
return?-EINVAL;
led_vals[0]?=?s3c2410_gpio_getpin(S3C2410_GPF(4));
led_vals[1]?=?s3c2410_gpio_getpin(S3C2410_GPF(5));
led_vals[2]?=?s3c2410_gpio_getpin(S3C2410_GPF(6));
copy_to_user(buf?led_vals?size);
return?size;
}
/**
?*?應用程序的write函數時最終會調用該函數調用一次只能控制一個led燈的兩滅
?*?buf:第一個byte表示控制第幾個led燈范圍0~3(0表示控制所有燈)?第2個byte取值1=亮燈0=滅燈
?*?size:只能等于2
?*/
ssize_t?led_drv_write(struct?file?*file?const?char?__user?*buf?size_t?size?loff_t?*ppos)
{
unsigned?char?led_vals[2];
unsigned?char?value?=?0led_num;
if?(?size?!=?2)//
return?-EINVAL;
copy_from_user(led_vals?buf?size);
value?=?led_vals[1]???0:?1;
led_num?=?led_vals[0];
if(led_num?==?0){//同時控制所有led
s3c2410_gpio_setpin(S3C2410_GPF(4)value);
s3c2410_gpio_setpin(S3C2410_GPF(5)value);
s3c2410_gpio_setpin(S3C2410_GPF(6)value);
}else{//單獨控制單個led
s3c2410_gpio_setpin(S3C2410_GPF(3+led_num)value);
}
return?0;
}
static?struct?file_operations?led_drv_fops?=?{
????.owner??=???THIS_MODULE
????.open???=???led_drv_open
.read = led_drv_read
.write??=???led_drv_write
};
int?major;
dev_t?led_dev;
/**
?*初始化函數在加載該模塊時就會調用
?*注冊設備
?*/
static?int?led_drv_init(void)
{
//?alloc_chrdev_region()
major?=?register_chrdev(0?“led_drv“?&led_drv_fops);
leddrv_class?=?class_create(THIS_MODULE?“led_drv“);
if(IS_ERR(leddrv_class))
return?PTR_ERR(leddrv_class);
/*?加載模塊后/dev目錄下會新增?leds?*/
leddrv_class_dev?=?device_create(leddrv_class?NULL?MKDEV(major?0)?NULL?“leds“);
?if(unlikely(IS_ERR(leddrv_class_dev)))
??return?PTR_ERR(leddrv_class_dev);
printk(“led_drv_init\n“);
return?0;
}
static?void?led_drv_exit(void)
{
unregister_chrdev(major?“led_drv“);
device_destroy(leddrv_class?MKDEV(major?0));//卸載設備
class_destroy(leddrv_class);//刪除class類
}
module_init(led_drv_init);
module_exit(led_drv_exit);
MODULE_LICENSE(“GPL“);
- 上一篇:茶百科源代碼
- 下一篇:網絡工程課程設計————參考
評論
共有 條評論