kernel
添加节点驱动
int chg_led = 0 ;
int pass_chg_led = 0 ;
EXPORT_SYMBOL( chg_led) ;
EXPORT_SYMBOL( pass_chg_led) ;
static ssize_t chgled_show( struct device *dev,
struct device_attribute *attr, char *buf)
{
pr_info( "%s, %d chg_led is %d\n " ,__func__,__LINE__,chg_led) ;
return sprintf( buf, "%d\n " ,chg_led) ;
}
static ssize_t chgled_store( struct device *dev,
struct device_attribute *attr,
const char *buf, size_t size)
{
unsigned long state;
ssize_t ret;
ret = kstrtoul( buf, 10 , & state) ;
if ( ret)
return ret;
pr_info( "%s, %d state is %d\n " ,__func__,__LINE__,state) ;
if ( state == LED_ON)
chg_led = 1 ;
if ( state == LED_OFF) {
chg_led = 0 ;
pass_chg_led = 0 ;
}
pr_info( "%s, %d chg_led is %d\n " ,__func__,__LINE__,chg_led) ;
ret = size;
return ret;
}
static DEVICE_ATTR_RW( chgled) ;
struct file_operations chg_led_ops = {
.owner = THIS_MODULE,
} ;
static dev_t devno;
static struct class *led_chrdev_class;
static struct device *chgled_chrdev;
static int __init chgled_init( void)
{
dev_t cur_dev;
int ret = 0 ;
pr_info( "%s, %d \n " ,__func__,__LINE__) ;
alloc_chrdev_region( & devno, 0 , DEV_CNT, DEV_NAME) ;
led_chrdev_class = class_create( THIS_MODULE, "chg_led_mode_class" ) ;
cur_dev = MKDEV( MAJOR( devno) , MINOR( devno)) ;
chgled_chrdev = device_create( led_chrdev_class , NULL , cur_dev , NULL , DEV_NAME) ;
ret = device_create_file( chgled_chrdev , & dev_attr_chgled) ;
if ( ret)
return -1;
return 0 ;
}
module_init( chgled_init) ;
static void __exit chgled_exit( void)
{
dev_t cur_dev;
pr_info( "%s, %d \n " ,__func__,__LINE__) ;
cur_dev = MKDEV( MAJOR( devno) , MINOR( devno)) ;
device_destroy( led_chrdev_class, cur_dev) ;
unregister_chrdev_region( devno, DEV_CNT) ;
class_destroy( led_chrdev_class) ;
device_remove_file( chgled_chrdev , & dev_attr_chgled) ;
}
module_exit( chgled_exit) ;
MODULE_LICENSE( "GPL" ) ;
配置Kconfig
alps/kernel-5.10/drivers/misc/Kconfig
config CHG_LED
tristate "CHARGER LED"
depends on I2C
default y
help
This driver provides support for CHARGER LED
配置Makefile
alps/kernel-5.10/drivers/misc/Makefile
obj-$( CONFIG_CHG_LED) += charger_led.o
配置内核编译项
alps/kernel-5.10/arch/arm64/configs/mgk_64_k510_defconfig
CONFIG_CHG_LED = m
添加ko表,注意添加位置
alps/kernel-5.10/device/mediateksample/tb8781p1_64/ko_order_table.csv
charger_led.ko,/drivers/misc/charger_led.ko,ramdisk,Y,Y,user/userdebug/eng
HAL层
添加bin文件
alps_a12/vendor/mediatek/proprietary/external/sensor-tools
配置device.mk
alps/device/mediatek/vendor/common/device.mk
或者alps/device/mediatek/vendor/mgvi_t_64_armv82/device.mk
PRODUCT_PACKAGES += libchgled
PRODUCT_PACKAGES += libdischgled
添加服务 alps/device/mediateksample/tb8781p1_64/init.project.rc
service chgled /vendor/bin/libchgled
user root
group root drmrpc system
class main
seclabel u:r:chgled:s0
oneshot
disabled
service dischgled /vendor/bin/libdischgled
user root
group root drmrpc system
class main
seclabel u:r:dischgled:s0
oneshot
disabled
添加权限 alps_a12/device/mediatek/sepolicy/basic/non_plat
diff --git a/non_plat/chgled.te b/non_plat/chgled.te
new file mode 100644
index 0000000.. f6e7d50
--- /dev/null
+++ b/non_plat/chgled.te
@@ -0,0 +1,15 @@
+type chgled, domain;
+type chgled_exec, exec_type,vendor_file_type,file_type;
+init_daemon_domain( chgled)
+
+allow chgled sysfs:file{ open write read getattr} ;
+allow chgled metadata_file:dir search;
+allow chgled proc_cmdline:file read ;
+allow chgled sysfs_dt_firmware_android:dir search;
+allow chgled gsi_metadata_file:dir search;
+allow chgled proc_cmdline:file open ;
+allow chgled sysfs_dt_firmware_android:file read ;
+allow chgled block_device:dir search;
+allow chgled proc_cmdline:file { open read getattr} ;
+allow chgled sysfs_dt_firmware_android:file { getattr open read } ;
+allow chgled nvram_device:blk_file { open read write} ;
diff --git a/non_plat/file_contexts b/non_plat/file_contexts
index 52325a7.. da6992d 100755
--- a/non_plat/file_contexts
+++ b/non_plat/file_contexts
@@ -971,6 +971,7 @@
/vendor/bin/libwakechg u:object_r:wakechg_exec:s0
/vendor/bin/libdiswakechg u:object_r:diswakechg_exec:s0
/vendor/bin/libbypass u:object_r:bypass_mode_exec:s0
+/vendor/bin/libchgled u:object_r:chgled_exec:s0
/dev/ccci_ccb_ctrl u:object_r:ccci_ccb_device:s0