如何在andrid linux kernel中植入一个文件节点
首先
#define PROC_NAME "ftxxxx-debug"
static struct proc_dir_entry *ftxxxx_proc_entry;
然后
int ftxxxx_create_apk_debug_channel(struct i2c_client * client)
{
ftxxxx_proc_entry = proc_create(PROC_NAME, 0777, NULL, &debug_flag_fops);
if (NULL == ftxxxx_proc_entry) {
dev_err(&client->dev, "[Focal][TOUCH_ERR] %s: Couldn't create proc entry!\n", __func__);
return -ENOMEM;
} else {
dev_info(&client->dev, "[Focal][Touch] %s: Create proc entry success! \n", __func__);
}
return 0;
}
static const struct file_operations debug_flag_fops = {
.owner = THIS_MODULE,
.read = ftxxxx_debug_read,
.write = ftxxxx_debug_write,
};
static ssize_t ftxxxx_debug_write(struct file *filp, const char __user *buff, size_t len, loff_t *data)
{
struct i2c_client *client = (struct i2c_client *)ftxxxx_ts->client;
unsigned char writebuf[FTS_PACKET_LENGTH];
int buflen = len;
int writelen = 0;
int ret = 0;
char upgrade_file_path[128];
if (copy_from_user(writebuf, buff, buflen)) {
dev_err(&client->dev, "[Focal][TOUCH_ERR] %s : copy from user error \n", __func__);
return -EFAULT;
}
proc_operate_mode = writebuf[0] - 48;
printk("[Focal][Touch] %s : proc write proc_operate_mode = %d !! \n", __func__, proc_operate_mode);
switch (proc_operate_mode) {
case PROC_UPGRADE:
break;
case PROC_WRITE_REGISTER:
break;
case PROC_READ_DATA:
case PROC_WRITE_DATA:
break;
default:
break;
}
return len;
}
/*interface of read proc*/
bool proc_read_status;
static ssize_t ftxxxx_debug_read(struct file *filp, char __user *buff, size_t len, loff_t *data)
{
struct i2c_client *client = (struct i2c_client *)ftxxxx_ts->client;
int ret = 0;
unsigned char buf[1000];
ssize_t num_read_chars = 0;
int readlen = 0;
u8 regvalue = 0x00, regaddr = 0x00;
switch (proc_operate_mode) {
case PROC_UPGRADE:
break;
case PROC_READ_REGISTER:
break;
case PROC_READ_DATA:
break;
case PROC_WRITE_DATA:
break;
default:
break;
}
memcpy(buff, buf, num_read_chars);
/*memcpy(buff, buf, num_read_chars);*/
/*kfree(buf);*/
if (!proc_read_status) {
proc_read_status = 1;
return num_read_chars;
} else {
proc_read_status = 0;
return 0;
}
首先
#define PROC_NAME "ftxxxx-debug"
static struct proc_dir_entry *ftxxxx_proc_entry;
然后
int ftxxxx_create_apk_debug_channel(struct i2c_client * client)
{
ftxxxx_proc_entry = proc_create(PROC_NAME, 0777, NULL, &debug_flag_fops);
if (NULL == ftxxxx_proc_entry) {
dev_err(&client->dev, "[Focal][TOUCH_ERR] %s: Couldn't create proc entry!\n", __func__);
return -ENOMEM;
} else {
dev_info(&client->dev, "[Focal][Touch] %s: Create proc entry success! \n", __func__);
}
return 0;
}
static const struct file_operations debug_flag_fops = {
.owner = THIS_MODULE,
.read = ftxxxx_debug_read,
.write = ftxxxx_debug_write,
};
static ssize_t ftxxxx_debug_write(struct file *filp, const char __user *buff, size_t len, loff_t *data)
{
struct i2c_client *client = (struct i2c_client *)ftxxxx_ts->client;
unsigned char writebuf[FTS_PACKET_LENGTH];
int buflen = len;
int writelen = 0;
int ret = 0;
char upgrade_file_path[128];
if (copy_from_user(writebuf, buff, buflen)) {
dev_err(&client->dev, "[Focal][TOUCH_ERR] %s : copy from user error \n", __func__);
return -EFAULT;
}
proc_operate_mode = writebuf[0] - 48;
printk("[Focal][Touch] %s : proc write proc_operate_mode = %d !! \n", __func__, proc_operate_mode);
switch (proc_operate_mode) {
case PROC_UPGRADE:
break;
case PROC_WRITE_REGISTER:
break;
case PROC_READ_DATA:
case PROC_WRITE_DATA:
break;
default:
break;
}
return len;
}
/*interface of read proc*/
bool proc_read_status;
static ssize_t ftxxxx_debug_read(struct file *filp, char __user *buff, size_t len, loff_t *data)
{
struct i2c_client *client = (struct i2c_client *)ftxxxx_ts->client;
int ret = 0;
unsigned char buf[1000];
ssize_t num_read_chars = 0;
int readlen = 0;
u8 regvalue = 0x00, regaddr = 0x00;
switch (proc_operate_mode) {
case PROC_UPGRADE:
break;
case PROC_READ_REGISTER:
break;
case PROC_READ_DATA:
break;
case PROC_WRITE_DATA:
break;
default:
break;
}
memcpy(buff, buf, num_read_chars);
/*memcpy(buff, buf, num_read_chars);*/
/*kfree(buf);*/
if (!proc_read_status) {
proc_read_status = 1;
return num_read_chars;
} else {
proc_read_status = 0;
return 0;
}
}
删除文件节点
void ftxxxx_release_apk_debug_channel(void)
{
if (ftxxxx_proc_entry)
remove_proc_entry(PROC_NAME, NULL);
}