xref: /OK3568_Linux_fs/yocto/poky/meta/classes/kernel-devicetree.bbclass (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun# Support for device tree generation
2*4882a593Smuzhiyunpython () {
3*4882a593Smuzhiyun    if not bb.data.inherits_class('nopackages', d):
4*4882a593Smuzhiyun        d.appendVar("PACKAGES", " ${KERNEL_PACKAGE_NAME}-devicetree")
5*4882a593Smuzhiyun        if d.getVar('KERNEL_DEVICETREE_BUNDLE') == '1':
6*4882a593Smuzhiyun            d.appendVar("PACKAGES", " ${KERNEL_PACKAGE_NAME}-image-zimage-bundle")
7*4882a593Smuzhiyun}
8*4882a593Smuzhiyun
9*4882a593SmuzhiyunFILES:${KERNEL_PACKAGE_NAME}-devicetree = "/${KERNEL_IMAGEDEST}/*.dtb /${KERNEL_IMAGEDEST}/*.dtbo"
10*4882a593SmuzhiyunFILES:${KERNEL_PACKAGE_NAME}-image-zimage-bundle = "/${KERNEL_IMAGEDEST}/zImage-*.dtb.bin"
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun# Generate kernel+devicetree bundle
13*4882a593SmuzhiyunKERNEL_DEVICETREE_BUNDLE ?= "0"
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun# dtc flags passed via DTC_FLAGS env variable
16*4882a593SmuzhiyunKERNEL_DTC_FLAGS ?= ""
17*4882a593Smuzhiyun
18*4882a593Smuzhiyunnormalize_dtb () {
19*4882a593Smuzhiyun	dtb="$1"
20*4882a593Smuzhiyun	if echo $dtb | grep -q '/dts/'; then
21*4882a593Smuzhiyun		bbwarn "$dtb contains the full path to the the dts file, but only the dtb name should be used."
22*4882a593Smuzhiyun		dtb=`basename $dtb | sed 's,\.dts$,.dtb,g'`
23*4882a593Smuzhiyun	fi
24*4882a593Smuzhiyun	echo "$dtb"
25*4882a593Smuzhiyun}
26*4882a593Smuzhiyun
27*4882a593Smuzhiyunget_real_dtb_path_in_kernel () {
28*4882a593Smuzhiyun	dtb="$1"
29*4882a593Smuzhiyun	dtb_path="${B}/arch/${ARCH}/boot/dts/$dtb"
30*4882a593Smuzhiyun	if [ ! -e "$dtb_path" ]; then
31*4882a593Smuzhiyun		dtb_path="${B}/arch/${ARCH}/boot/$dtb"
32*4882a593Smuzhiyun	fi
33*4882a593Smuzhiyun	echo "$dtb_path"
34*4882a593Smuzhiyun}
35*4882a593Smuzhiyun
36*4882a593Smuzhiyundo_configure:append() {
37*4882a593Smuzhiyun	if [ "${KERNEL_DEVICETREE_BUNDLE}" = "1" ]; then
38*4882a593Smuzhiyun		if echo ${KERNEL_IMAGETYPE_FOR_MAKE} | grep -q 'zImage'; then
39*4882a593Smuzhiyun			case "${ARCH}" in
40*4882a593Smuzhiyun				"arm")
41*4882a593Smuzhiyun				config="${B}/.config"
42*4882a593Smuzhiyun				if ! grep -q 'CONFIG_ARM_APPENDED_DTB=y' $config; then
43*4882a593Smuzhiyun					bbwarn 'CONFIG_ARM_APPENDED_DTB is NOT enabled in the kernel. Enabling it to allow the kernel to boot with the Device Tree appended!'
44*4882a593Smuzhiyun					sed -i "/CONFIG_ARM_APPENDED_DTB[ =]/d" $config
45*4882a593Smuzhiyun					echo "CONFIG_ARM_APPENDED_DTB=y" >> $config
46*4882a593Smuzhiyun					echo "# CONFIG_ARM_ATAG_DTB_COMPAT is not set" >> $config
47*4882a593Smuzhiyun				fi
48*4882a593Smuzhiyun				;;
49*4882a593Smuzhiyun				*)
50*4882a593Smuzhiyun				bberror "KERNEL_DEVICETREE_BUNDLE is not supported for ${ARCH}. Currently it is only supported for 'ARM'."
51*4882a593Smuzhiyun			esac
52*4882a593Smuzhiyun		else
53*4882a593Smuzhiyun			bberror 'The KERNEL_DEVICETREE_BUNDLE requires the KERNEL_IMAGETYPE to contain zImage.'
54*4882a593Smuzhiyun		fi
55*4882a593Smuzhiyun	fi
56*4882a593Smuzhiyun}
57*4882a593Smuzhiyun
58*4882a593Smuzhiyundo_compile:append() {
59*4882a593Smuzhiyun	if [ -n "${KERNEL_DTC_FLAGS}" ]; then
60*4882a593Smuzhiyun		export DTC_FLAGS="${KERNEL_DTC_FLAGS}"
61*4882a593Smuzhiyun	fi
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun	for dtbf in ${KERNEL_DEVICETREE}; do
64*4882a593Smuzhiyun		dtb=`normalize_dtb "$dtbf"`
65*4882a593Smuzhiyun		oe_runmake $dtb CC="${KERNEL_CC} $cc_extra " LD="${KERNEL_LD}" ${KERNEL_EXTRA_ARGS}
66*4882a593Smuzhiyun	done
67*4882a593Smuzhiyun}
68*4882a593Smuzhiyun
69*4882a593Smuzhiyundo_install:append() {
70*4882a593Smuzhiyun	for dtbf in ${KERNEL_DEVICETREE}; do
71*4882a593Smuzhiyun		dtb=`normalize_dtb "$dtbf"`
72*4882a593Smuzhiyun		dtb_ext=${dtb##*.}
73*4882a593Smuzhiyun		dtb_base_name=`basename $dtb .$dtb_ext`
74*4882a593Smuzhiyun		dtb_path=`get_real_dtb_path_in_kernel "$dtb"`
75*4882a593Smuzhiyun		install -m 0644 $dtb_path ${D}/${KERNEL_IMAGEDEST}/$dtb_base_name.$dtb_ext
76*4882a593Smuzhiyun	done
77*4882a593Smuzhiyun}
78*4882a593Smuzhiyun
79*4882a593Smuzhiyundo_deploy:append() {
80*4882a593Smuzhiyun	for dtbf in ${KERNEL_DEVICETREE}; do
81*4882a593Smuzhiyun		dtb=`normalize_dtb "$dtbf"`
82*4882a593Smuzhiyun		dtb_ext=${dtb##*.}
83*4882a593Smuzhiyun		dtb_base_name=`basename $dtb .$dtb_ext`
84*4882a593Smuzhiyun		install -d $deployDir
85*4882a593Smuzhiyun		install -m 0644 ${D}/${KERNEL_IMAGEDEST}/$dtb_base_name.$dtb_ext $deployDir/$dtb_base_name-${KERNEL_DTB_NAME}.$dtb_ext
86*4882a593Smuzhiyun		if [ "${KERNEL_IMAGETYPE_SYMLINK}" = "1" ] ; then
87*4882a593Smuzhiyun			ln -sf $dtb_base_name-${KERNEL_DTB_NAME}.$dtb_ext $deployDir/$dtb_base_name.$dtb_ext
88*4882a593Smuzhiyun		fi
89*4882a593Smuzhiyun		if [ -n "${KERNEL_DTB_LINK_NAME}" ] ; then
90*4882a593Smuzhiyun			ln -sf $dtb_base_name-${KERNEL_DTB_NAME}.$dtb_ext $deployDir/$dtb_base_name-${KERNEL_DTB_LINK_NAME}.$dtb_ext
91*4882a593Smuzhiyun		fi
92*4882a593Smuzhiyun		for type in ${KERNEL_IMAGETYPE_FOR_MAKE}; do
93*4882a593Smuzhiyun			if [ "$type" = "zImage" ] && [ "${KERNEL_DEVICETREE_BUNDLE}" = "1" ]; then
94*4882a593Smuzhiyun				cat ${D}/${KERNEL_IMAGEDEST}/$type \
95*4882a593Smuzhiyun					$deployDir/$dtb_base_name-${KERNEL_DTB_NAME}.$dtb_ext \
96*4882a593Smuzhiyun					> $deployDir/$type-$dtb_base_name-${KERNEL_DTB_NAME}.$dtb_ext${KERNEL_DTB_BIN_EXT}
97*4882a593Smuzhiyun				if [ -n "${KERNEL_DTB_LINK_NAME}" ]; then
98*4882a593Smuzhiyun					ln -sf $type-$dtb_base_name-${KERNEL_DTB_NAME}.$dtb_ext${KERNEL_DTB_BIN_EXT} \
99*4882a593Smuzhiyun						$deployDir/$type-$dtb_base_name-${KERNEL_DTB_LINK_NAME}.$dtb_ext${KERNEL_DTB_BIN_EXT}
100*4882a593Smuzhiyun				fi
101*4882a593Smuzhiyun				if [ -e "${KERNEL_OUTPUT_DIR}/${type}.initramfs" ]; then
102*4882a593Smuzhiyun					cat ${KERNEL_OUTPUT_DIR}/${type}.initramfs \
103*4882a593Smuzhiyun						$deployDir/$dtb_base_name-${KERNEL_DTB_NAME}.$dtb_ext \
104*4882a593Smuzhiyun						>  $deployDir/${type}-${INITRAMFS_NAME}-$dtb_base_name-${KERNEL_DTB_NAME}.$dtb_ext${KERNEL_DTB_BIN_EXT}
105*4882a593Smuzhiyun					if [ -n "${KERNEL_DTB_LINK_NAME}" ]; then
106*4882a593Smuzhiyun						ln -sf ${type}-${INITRAMFS_NAME}-$dtb_base_name-${KERNEL_DTB_NAME}.$dtb_ext${KERNEL_DTB_BIN_EXT} \
107*4882a593Smuzhiyun							$deployDir/${type}-${INITRAMFS_NAME}-$dtb_base_name-${KERNEL_DTB_LINK_NAME}.$dtb_ext${KERNEL_DTB_BIN_EXT}
108*4882a593Smuzhiyun					fi
109*4882a593Smuzhiyun				fi
110*4882a593Smuzhiyun			fi
111*4882a593Smuzhiyun		done
112*4882a593Smuzhiyun	done
113*4882a593Smuzhiyun}
114