1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
# Constructs a bootable, fixed-offset mtd image with u-boot
# bootloader, kernel fitimage, read only root filesystem,
# and writeable overlay filesystem.
IMAGE_BASETYPE ?= "squashfs-xz"
OVERLAY_BASETYPE ?= "jffs2"
IMAGE_TYPES += "overlay"
IMAGE_TYPEDEP_overlay = "${IMAGE_BASETYPE}"
IMAGE_TYPES_MASKED += "overlay"
FLASH_KERNEL_IMAGE ?= "fitImage-${INITRAMFS_IMAGE}-${MACHINE}.bin"
FLASH_UBOOT_OFFSET ?= "0"
FLASH_KERNEL_OFFSET ?= "512"
FLASH_ROFS_OFFSET ?= "4864"
FLASH_RWFS_OFFSET ?= "28672"
RWFS_SIZE ?= "4096"
# Allow rwfs mkfs configuration through OVERLAY_MKFS_OPTS and OVERRIDES. However,
# avoid setting 'ext4' or 'jffs2' in OVERRIDES as such raw filesystem types are
# reserved for the primary image (and setting them currently breaks the build).
# Instead, prefix the overlay override value with 'rwfs-' to avoid collisions.
DISTROOVERRIDES .= ":rwfs-${OVERLAY_BASETYPE}"
OVERLAY_MKFS_OPTS_rwfs-ext4 = "-b 4096 -F -O^huge_file"
# $(( ${FLASH_SIZE} - ${FLASH_RWFS_OFFSET} ))
mk_nor_image() {
image_dst="$1"
image_size_kb=$2
dd if=/dev/zero bs=1k count=$image_size_kb \
| tr '\000' '\377' > $image_dst
}
do_generate_flash() {
ddir="${IMGDEPLOYDIR}"
kernel="${FLASH_KERNEL_IMAGE}"
uboot="u-boot.${UBOOT_SUFFIX}"
rootfs="${IMAGE_LINK_NAME}.${IMAGE_BASETYPE}"
rwfs="rwfs.${OVERLAY_BASETYPE}"
flash="${IMAGE_NAME}.overlay"
mk_nor_image ${S}/$rwfs ${RWFS_SIZE}
if [ "${OVERLAY_BASETYPE}" != jffs2 ]; then
mkfs.${OVERLAY_BASETYPE} ${OVERLAY_MKFS_OPTS} ${S}/$rwfs || \
bbfatal "mkfs rwfs"
fi
# Assemble the flash image
dst="$ddir/$flash"
mk_nor_image $dst ${FLASH_SIZE}
dd if=${DEPLOY_DIR_IMAGE}/$uboot of=$dst bs=1k conv=notrunc seek=${FLASH_UBOOT_OFFSET}
dd if=${DEPLOY_DIR_IMAGE}/$kernel of=$dst bs=1k conv=notrunc seek=${FLASH_KERNEL_OFFSET}
dd if=$ddir/$rootfs of=$dst bs=1k conv=notrunc seek=${FLASH_ROFS_OFFSET}
dd if=${S}/$rwfs of=$dst bs=1k conv=notrunc seek=${FLASH_RWFS_OFFSET}
cd ${IMGDEPLOYDIR}
ln -sf $flash ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.overlay
# Maintain a number of non-standard name legacy links.
ln -sf $flash ${IMGDEPLOYDIR}/flash-${MACHINE}
ln -sf $flash ${IMGDEPLOYDIR}/image-bmc
ln -sf $uboot ${IMGDEPLOYDIR}/image-u-boot
ln -sf $kernel ${IMGDEPLOYDIR}/image-kernel
ln -sf $rootfs ${IMGDEPLOYDIR}/image-rofs
cp ${S}/$rwfs ${IMGDEPLOYDIR}/$rwfs
ln -sf $rwfs ${IMGDEPLOYDIR}/image-rwfs
}
make_overlay_tars() {
ddir="${IMGDEPLOYDIR}"
kernel="${FLASH_KERNEL_IMAGE}"
uboot="u-boot.${UBOOT_SUFFIX}"
rootfs="${IMAGE_LINK_NAME}.${IMAGE_BASETYPE}"
rwfs="rwfs.${OVERLAY_BASETYPE}"
flash="${IMAGE_NAME}.overlay"
alltar="${IMAGE_NAME}.all.tar"
tar="${IMAGE_NAME}.tar"
# Create some links to help make the tar archives
ln -sf $ddir/${IMAGE_LINK_NAME}.overlay ${S}/image-bmc
ln -sf ${DEPLOY_DIR_IMAGE}/$uboot ${S}/image-u-boot
ln -sf ${DEPLOY_DIR_IMAGE}/$kernel ${S}/image-kernel
ln -sf $ddir/$rootfs ${S}/image-rofs
ln -sf $rwfs ${S}/image-rwfs
# Create the tar archives
tar -h -cvf $ddir/$alltar -C ${S} image-bmc MANIFEST
tar -h -cvf $ddir/$tar -C ${S} image-u-boot image-kernel image-rofs image-rwfs MANIFEST
cd ${IMGDEPLOYDIR}
ln -sf $alltar ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.all.tar
ln -sf $tar ${IMGDEPLOYDIR}/${IMAGE_LINK_NAME}.tar
# Maintain a number of non-standard name legacy links.
ln -sf $tar ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.tar
ln -sf $alltar ${IMGDEPLOYDIR}/${MACHINE}-${DATETIME}.all.tar
}
make_overlay_tars[vardepsexclude] = "DATETIME"
def generate_manifest(d):
import configparser
import io
path = d.getVar('STAGING_DIR_HOST', True) + d.getVar('sysconfdir', True)
path = os.path.join(path, 'os-release')
parser = configparser.SafeConfigParser(strict=False)
parser.optionxform = str
version = ''
with open(path, 'r') as fd:
buf = '[root]\n' + fd.read()
fd = io.StringIO(buf)
parser.readfp(fd)
version = parser['root']['VERSION_ID']
with open(os.path.join(d.getVar('S', True), 'MANIFEST'), 'w') as fd:
fd.write('purpose=xyz.openbmc_project.Software.Version.VersionPurpose.BMC\n')
fd.write('version={}\n'.format(version.strip('"')))
python do_generate_tars() {
generate_manifest(d)
bb.build.exec_func('make_overlay_tars', d)
}
do_generate_flash[depends] += " \
${PN}:do_image_${@d.getVar('IMAGE_BASETYPE', True).replace('-', '_')} \
virtual/kernel:do_deploy \
u-boot:do_populate_sysroot \
"
do_generate_tars[depends] += " \
${PN}:do_generate_flash \
os-release:do_populate_sysroot \
"
addtask generate_flash before do_image_complete
addtask generate_tars before do_image_complete
|