第一个问题:
Android8
目的:以模块的形式添加新的驱动。
新的内核文件:makefile up.c
描述:添加一个新的内核驱动模块 发现makefile报错 报错信息如下:
root@work00:/px30/source/px30_android8_20210926/code# make
make -C /px30/source/px30_android8_20210926/px30_oreo M=/px30/source/px30_android8_20210926/code modules
make[1]: Entering directory '/px30/source/px30_android8_20210926/px30_oreo'
build/core/product_config.mk:227: *** Can not locate config makefile for product "rk3326". Stop.
09:52:14 Error dumping make vars: exit status 2
build/core/main.mk:21: recipe for target 'run_soong_ui' failed
make[1]: *** [run_soong_ui] Error 1
make[1]: Leaving directory '/px30/source/px30_android8_20210926/px30_oreo'
Makefile:5: recipe for target 'all' failed
make: *** [all] Error 2
makefile:
obj-m := up.o
PWD := $(shell pwd)
KERNELDIR := /px30/source/px30_android8_20210926/px30_oreo
all:
make -C $(KERNELDIR) M=$(PWD) modules
.PHONY: clean
clean:
rm -rf *.o *~ core *.ko *.mod.c modules.order Module.symvers
up.c
很简单没报错。
第二个问题:
Android8
目的:以内核源码的形式添加一个新的驱动
文件:up.c makefile
描述:在kernel/drivers目录中添加uplooking文件夹,将上诉两个文件添加进去。 编译后没报错 在开机中能看到up.c中XXX_init函数打印出来的信息。烧录进去后在设备中/dev中没有查看到设备号。 但是在cat proc/devices中能看到新驱动的设备号。在sys/各个目录中也没有查到。请问一下这个怎么回事?
kernel/drivers/uplooking/makefile:
obj-y = up.o
在kernel/drivers/makefile 也添加了。
这是up.c
#include <linux/init.h>
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/ide.h>
#include <linux/cdev.h>
#include <linux/device.h>
static int chrtest_open(struct inode *inode, struct file *filp);
static ssize_t chrtest_read(struct file *filp, char __user *buf,size_t cnt, loff_t *offt);
static ssize_t chrtest_write(struct file *filp,const char __user *buf,size_t cnt, loff_t *offt);
static int chrtest_release(struct inode *inode, struct file *filp);
/* uplooking设备结构体 */
struct uplooking_dev{
dev_t devid; /* 设备号 */
struct cdev cdev; /* cdev */
struct class *class; /* 类 */
struct device *device; /* 设备 */
int major; /* 主设备号 */
int minor; /* 次设备号 */
struct device_node *nd; /* 设备节点 */
int uplooking_gpio; /* beep所使用的GPIO编号 */
};
struct uplooking_dev uplooking; /* beep设备 */
static struct file_operations test_fops = {
.owner = THIS_MODULE,
.open = chrtest_open,
.read = chrtest_read,
.write = chrtest_write,
.release = chrtest_release,
};
static int chrtest_open(struct inode *inode, struct file *filp)
{
/* 用户实现具体功能 */
printk("uplookinglooking open\n");
return 0;
}
/* 从设备读取 */
static ssize_t chrtest_read(struct file *filp, char __user *buf,size_t cnt, loff_t *offt)
{
/* 用户实现具体功能 */
printk("uplookinglooking read\n");
return 0;
}
/* 向设备写数据 */
static ssize_t chrtest_write(struct file *filp,const char __user *buf,size_t cnt, loff_t *offt)
{
/* 用户实现具体功能 */
printk("uplookinglooking write\n");
return 0;
}
/* 关闭/释放设备 */
static int chrtest_release(struct inode *inode, struct file *filp)
{
/* 用户实现具体功能 */
printk("uplookinglooking release\n");
return 0;
}
static __init int test_init(void)
{
int i=0;
int retvalue = 0;
for(i=0;i<10;i++)
{
printk("hello uplookinglooking\n");
}
/* 注册字符设备驱动 */
retvalue = register_chrdev(232, "uplookinglooking", &test_fops);
if(retvalue < 0){
/* 字符设备注册失败,自行处理 */
printk("uplookinglooking err!!!!\n");
}
uplooking.cdev.owner = THIS_MODULE;
cdev_init(&uplooking.cdev, &test_fops);
cdev_add(&uplooking.cdev, 232, 1);
uplooking.class = class_create(THIS_MODULE, "uplookinglooking");
if (IS_ERR(uplooking.class)) {
printk("uplooking.class err!!!!\n");
return PTR_ERR(uplooking.class);
}
uplooking.device = device_create(uplooking.class, NULL, 232, NULL, "uplookinglooking");
if (IS_ERR(uplooking.device)) {
printk("uplooking.device err!!!!\n");
return PTR_ERR(uplooking.device);
}
return 0;
}
static __exit int test_exit(void)
{
unregister_chrdev(232, "uplookinglooking");
return 0;
}
module_init(test_init);
module_init(test_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("zhangcheng");
MODULE_DESCRIPTION("This is the first driver.");
|