Files
BPI-CM9-Linux/amlbian/scripts/modules_install.sh
T
2026-08-24 10:03:24 +08:00

287 lines
9.0 KiB
Bash
Executable File

#!/bin/sh
# SPDX-License-Identifier: (GPL-2.0-only OR MIT)
# Copyright (C) 2026 Amlogic, Inc. All rights reserved
#
# merge_config.sh - Takes a list of config fragment values, and merges
# them one by one. Provides warnings on overridden values, and specified
# values that did not make it to the resulting .config file (due to missed
# dependencies or config symbol removal).
#
# Portions reused from kconf_check and generate_cfg:
# http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/kconf_check
# http://git.yoctoproject.org/cgit/cgit.cgi/yocto-kernel-tools/tree/tools/generate_cfg
#
# Copyright (c) 2009-2010 Wind River Systems, Inc.
# Copyright 2011 Linaro
if [ $# -lt 2 ] ; then
echo "param number: $#, need to provide output dir path and common driver path"
exit 1
fi
OUT_AMLOGIC_DIR=$1
MODULES_STAGING_DIR=${OUT_AMLOGIC_DIR}
COMMON_DRIVERS_DIR=$2
KERNEL_VER=$3
NAND_FLAG=$4
if [ $# -gt 4 ]; then
MACHINE=$5
fi
echo "machine: $MACHINE"
SEQUENCE_FILE_PATH=${COMMON_DRIVERS_DIR}/scripts/amlogic/modules_sequence_list
mod_probe() {
local ko=$1
local loop
for loop in `grep "^$ko:" modules.dep | sed 's/.*://'`; do
mod_probe $loop
echo insmod $loop >> __install.sh
done
}
function mod_probe_recovery() {
local ko=$1
local loop
for loop in `grep "^$ko:" modules_recovery.dep | sed 's/.*://'`; do
mod_probe_recovery $loop
echo insmod $loop >> __install_recovery.sh
done
}
function regenerate_modules_sequence_list()
{
echo "nand flag: ${NAND_FLAG}"
cp ${SEQUENCE_FILE_PATH} ${SEQUENCE_FILE_PATH}.temp
if ${NAND_FLAG}; then
echo "add nand ko to list"
sed -i "/mmc/a\\\tamlogic-mtd-common\n\tamlogic_mtd_nfc" ${SEQUENCE_FILE_PATH}
sed -i "/aml_drm/a\\\tamlogic-fs-yaffs" ${SEQUENCE_FILE_PATH}
fi
}
adjust_sequence_modules_loading() {
chips=$(echo ${MACHINE} | cut -d'-' -f1 | cut -c6-)
if [ $chips = "g12b" ] || [ $chips = "sm1" ];then
chips=g12a
fi
echo " chips list: ${chips}"
source ${COMMON_DRIVERS_DIR}/scripts/amlogic/modules_sequence_list
cp modules.dep modules.dep.temp
soc_module=()
for chip in ${chips[@]}; do
chip_module=`ls amlogic-*-soc-${chip}.ko`
soc_module=(${soc_module[@]} ${chip_module[@]})
done
echo soc_module=${soc_module[*]}
delete_soc_module=()
if [[ ${#soc_module[@]} == 0 ]]; then
echo "Use all soc module"
else
for module in `ls amlogic-*-soc-*`; do
if [[ ! "${soc_module[@]}" =~ "${module}" ]] ; then
echo Delete soc module: ${module}
sed -n "/${module}:/p" modules.dep.temp
sed -i "/${module}:/d" modules.dep.temp
delete_soc_module=(${delete_soc_module[@]} ${module})
fi
done
echo delete_soc_module=${delete_soc_module[*]}
fi
delete_module=()
for module in ${MODULES_LOAD_BLACK_LIST[@]}; do
modules=`ls ${module}*`
delete_module=(${delete_module[@]} ${modules[@]})
done
if [[ ${#delete_module[@]} == 0 ]]; then
echo "No delete module, MODULES_LOAD_BLACK_LIST=${MODULES_LOAD_BLACK_LIST[*]}"
else
echo delete_module=${delete_module[*]}
for module in ${delete_module[@]}; do
echo Delete module: ${module}
sed -n "/${module}:/p" modules.dep.temp
sed -i "/${module}:/d" modules.dep.temp
done
fi
cat modules.dep.temp | cut -d ':' -f 2 > modules.dep.temp1
delete_modules=(${delete_soc_module[@]} ${delete_module[@]})
for module in ${delete_modules[@]}; do
match=`sed -n "/${module}/=" modules.dep.temp1`
for match in ${match[@]}; do
match_count=(${match_count[@]} $match)
done
if [[ ${#match_count[@]} != 0 ]]; then
echo "Error ${#match_count[@]} modules depend on ${module}, please modify:"
echo ${COMMON_DRIVERS_DIR}/scripts/amlogic/modules_sequence_list:MODULES_LOAD_BLACK_LIST
exit
fi
rm -f ${module}
done
rm -f modules.dep.temp1
touch modules.dep.temp1
for module in ${RAMDISK_MODULES_LOAD_LIST[@]}; do
echo RAMDISK_MODULES_LOAD_LIST: $module
sed -n "/${module}:/p" modules.dep.temp
sed -n "/${module}:/p" modules.dep.temp >> modules.dep.temp1
sed -i "/${module}:/d" modules.dep.temp
sed -n "/${module}.*\.ko:/p" modules.dep.temp
sed -n "/${module}.*\.ko:/p" modules.dep.temp >> modules.dep.temp1
sed -i "/${module}.*\.ko:/d" modules.dep.temp
done
for module in ${VENDOR_MODULES_LOAD_FIRST_LIST[@]}; do
echo VENDOR_MODULES_LOAD_FIRST_LIST: $module
sed -n "/${module}:/p" modules.dep.temp
sed -n "/${module}:/p" modules.dep.temp >> modules.dep.temp1
sed -i "/${module}:/d" modules.dep.temp
sed -n "/${module}.*\.ko:/p" modules.dep.temp
sed -n "/${module}.*\.ko:/p" modules.dep.temp >> modules.dep.temp1
sed -i "/${module}.*\.ko:/d" modules.dep.temp
done
if [ -f modules.dep.temp2 ]; then
rm modules.dep.temp2
fi
touch modules.dep.temp2
for module in ${VENDOR_MODULES_LOAD_LAST_LIST[@]}; do
echo VENDOR_MODULES_LOAD_FIRST_LIST: $module
sed -n "/${module}:/p" modules.dep.temp
sed -n "/${module}:/p" modules.dep.temp >> modules.dep.temp2
sed -i "/${module}:/d" modules.dep.temp
sed -n "/${module}.*\.ko:/p" modules.dep.temp
sed -n "/${module}.*\.ko:/p" modules.dep.temp >> modules.dep.temp2
sed -i "/${module}.*\.ko:/d" modules.dep.temp
done
cat modules.dep.temp >> modules.dep.temp1
cat modules.dep.temp2 >> modules.dep.temp1
cp modules.dep.temp1 modules.dep
rm modules.dep.temp
rm modules.dep.temp1
rm modules.dep.temp2
}
create_ramdisk_vendor() {
install_temp=$1
source ${COMMON_DRIVERS_DIR}/scripts/amlogic/modules_sequence_list
ramdisk_module_i=${#RAMDISK_MODULES_LOAD_LIST[@]}
while [ ${ramdisk_module_i} -gt 0 ]; do
let ramdisk_module_i--
echo ramdisk_module_i=$ramdisk_module_i ${RAMDISK_MODULES_LOAD_LIST[${ramdisk_module_i}]}
if [[ `grep "${RAMDISK_MODULES_LOAD_LIST[${ramdisk_module_i}]}" ${install_temp}` ]]; then
last_ramdisk_module=${RAMDISK_MODULES_LOAD_LIST[${ramdisk_module_i}]}
break;
fi
done
# last_ramdisk_module=${RAMDISK_MODULES_LOAD_LIST[${#RAMDISK_MODULES_LOAD_LIST[@]}-1]}
last_ramdisk_module_line=`sed -n "/${last_ramdisk_module}/=" ${install_temp}`
for line in ${last_ramdisk_module_line}; do
ramdisk_last_line=${line}
done
export ramdisk_last_line
head -n ${ramdisk_last_line} ${install_temp} > ramdisk_install.sh
mkdir ramdisk
cat ramdisk_install.sh | cut -d ' ' -f 2 > ramdisk/ramdisk_modules.order
cat ramdisk_install.sh | cut -d ' ' -f 2 | xargs mv -t ramdisk/
sed -i '1s/^/#!\/bin\/sh\n\nset -x\n/' ramdisk_install.sh
echo "echo Install ramdisk modules success!" >> ramdisk_install.sh
chmod 755 ramdisk_install.sh
sed -i 's/aml_drm\.ko/& video_axis_zoom=1/' ramdisk_install.sh
mv ramdisk_install.sh ramdisk/
file_last_line=`sed -n "$=" ${install_temp}`
let line=${file_last_line}-${ramdisk_last_line}
tail -n ${line} ${install_temp} > vendor_install.sh
mkdir vendor
cat vendor_install.sh | cut -d ' ' -f 2 > vendor/vendor_modules.order
cat vendor_install.sh | cut -d ' ' -f 2 | xargs mv -t vendor/
sed -i '1s/^/#!\/bin\/sh\n\nset -x\n/' vendor_install.sh
echo "echo Install vendor modules success!" >> vendor_install.sh
chmod 755 vendor_install.sh
mv vendor_install.sh vendor/
}
modules_install() {
mkdir -p ${OUT_AMLOGIC_DIR}/modules
mkdir -p ${OUT_AMLOGIC_DIR}/ext_modules
regenerate_modules_sequence_list
cat ${SEQUENCE_LIST_PATH}
#local MODULES_ROOT_DIR=$(echo ${MODULES_STAGING_DIR}/lib/modules/*)
local MODULES_ROOT_DIR=${MODULES_STAGING_DIR}/lib/modules/${KERNEL_VER}/
pushd ${MODULES_ROOT_DIR}
local common_drivers=${COMMON_DRIVERS_DIR##*/}
echo "common_drivers: $common_driver"
local modules_list=$(find -type f -name "*.ko")
for module in ${modules_list}; do
if [[ -n ${ANDROID_PROJECT} ]]; then # copy internal build modules
if [[ `echo ${module} | grep -E "\.\/kernel\/|\/${common_drivers}\/"` ]]; then
cp ${module} ${OUT_AMLOGIC_DIR}/modules/
else
cp ${module} ${OUT_AMLOGIC_DIR}/ext_modules/
fi
else # copy all modules, include external modules
cp ${module} ${OUT_AMLOGIC_DIR}/modules/
fi
done
if [[ -n ${ANDROID_PROJECT} ]]; then # internal build modules
grep -E "^kernel\/|^${common_drivers}\/" modules.dep > ${OUT_AMLOGIC_DIR}/modules/modules.dep
else # all modules, include external modules
cp modules.dep ${OUT_AMLOGIC_DIR}/modules
fi
popd
pushd ${OUT_AMLOGIC_DIR}/modules
sed -i 's#[^ ]*/##g' modules.dep
adjust_sequence_modules_loading "${arg1[*]}"
touch __install.sh
touch modules.order
for loop in `cat modules.dep | sed 's/:.*//'`; do
mod_probe $loop
echo $loop >> modules.order
echo insmod $loop >> __install.sh
done
cat __install.sh | awk ' {
if (!cnt[$2]) {
print $0;
cnt[$2]++;
}
}' > __install.sh.tmp
create_ramdisk_vendor __install.sh.tmp
echo "#!/bin/sh" > install.sh
echo "cd ramdisk" >> install.sh
echo "./ramdisk_install.sh" >> install.sh
echo "cd ../vendor" >> install.sh
echo "./vendor_install.sh" >> install.sh
echo "cd ../" >> install.sh
chmod 755 install.sh
echo "/modules/: all `wc -l modules.dep | awk '{print $1}'` modules."
rm __install.sh __install.sh.tmp
popd
}
modules_install
rm -rf ${OUT_AMLOGIC_DIR}/lib/modules/*/build
rm -rf ${OUT_AMLOGIC_DIR}/lib/modules/*/source
#mv ${SEQUENCE_FILE_PATH}.temp ${SEQUENCE_FILE_PATH}