first_driver.c
#include <linux/module.h>
#include <linux/init.h>#include <linux/platform_device.h>
#include <linux/cdev.h>
#include <linux/fs.h>
static int chrdev_probe(struct platform_device *dev)
{
printk(KERN_ALERT"chrdev probe! \n");
return 0;
};
/*platform_device 结构体*/
static struct platform_device chrdev_platform_device =
{
.name = "swj_first_driver",
.id = 0,
.dev = { },
};
/*platform_driver 结构体,name一定要一致,否则无法匹配到*/
static struct platform_driver chrdev_platform_driver =
{
.probe = chrdev_probe,
.driver = {
.name = "swj_first_driver",
.owner = THIS_MODULE,
},
};
static __init int chrdev_init(void)
{
int ret = 0;
printk(KERN_ARERT"chrdev init!\n");
//注册设备
ret = platform_device_register(&chrdev_platform_device);
if(ret)
{
printk(KERN_ARERT"platform_device_register failed!\n");
return ret;
}
//注册驱动
ret = platform_driver_register(&chrdev_platform_driver);
if(ret)
{
printk(KERN_ARERT"platform_driver_register failed!\n");
}
printk(KERN_ALERT"chrdev_init ok! \n");
}
static __exit void chrdev_exit(void)
{
printk(KERN_ALERT "chrdev exit! \n");
platform_driver_unregister(&chrdev_platform_driver);
}
/*module_init 这个宏在模块的目标代码中增加特殊段,
用于说明内核初始化函数的所在位置*/
module_init(chrdev_init);
/* 用于说明内核退出的所在位置
*/
module_exit(chrdev_exit);
MODULE_LICENSE("Dual BSD/GPL");
由于对于Linux的陌生 我只能是照搬照抄
下面就是添加相应的Kconfig 和 makefile文件了
首先定义使用的宏 我是高通平台
所以我定义在code/kernel/arch/arm/configs/J101_BLU_defconfig
CONFIG_FIRST_DRIVER=y
由于我将first_driver.c添加到 /code/kernel/drivers/media/video/msm/目录下 所以这里要修改这里的Kconfig 和 makefile
找一个比较中间的地方添加,其实顺序无所谓只不过我个人感觉这样安全。
Kconfig 添加代码如下
config FIRST_DRIVER
bool "first driver"
default n
---help---
this is my first android driver
makefile下面添加代码如下
obj-$(CONFIG_FIRST_DRIVER) += first_driver.o
然后编译kernel 即可
然后通过adb shell cat /proc/kmsg > kernel.txt
抓取log 看里面的log 有没有打出即可知道是否加载成功。