aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/orion/image/generic.mk
blob: 0594ebffad8716eb03ce30e14cb6e7a3906ce3d1 (plain)
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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
#
# Copyright (C) 2008-2012 OpenWrt.org
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#

### DO NOT INDENT LINES CONTAINING $(call xyz) AS THIS MAY CHANGE THE CONTEXT
### OF THE FIRST LINE IN THE CALLED VARIABLE (NOTE: variable!)
### see http://www.gnu.org/software/make/manual/html_node/Call-Function.html#Call-Function
### ACTUALLY IT IS A SIMPLE MACRO EXPANSION

### use round brackets for make variables, and curly brackets for shell variables


## Kernel mtd partition size in KiB
KERNEL_MTD_SIZE:=1024

# Netgear WNR854T: erase size is 128KiB = 0x00020000 = 131072
ERASE_SIZE_WNR854T:=128
UIMAGE_FILE_NAME_WNR854T:=uImage

# Linksys WRT350N v2: erase size is 64KiB = 0x00010000 = 65536
ERASE_SIZE_WRT350Nv2:=64

# define JFFS2 sizes for include/image.mk
JFFS2_BLOCKSIZE:=64k 128k


###
### Image/Prepare
###

define Image/Prepare
### Dummy comment for indented calls of Image/Prepare
	cp '$(LINUX_DIR)/arch/arm/boot/zImage' '$(BIN_DIR)/$(IMG_PREFIX)-zImage'
endef


###
### Image/BuildKernel
###

define Image/BuildKernel
### Dummy comment for indented calls of Image/BuildKernel

 ## Netgear WNR854T: mach id 1801 (0x0709)
$(call Image/BuildKernel/ARM/zImage,wnr854t,"\x07\x1c\xa0\xe3\x09\x10\x81\xe3")
$(call Image/BuildKernel/ARM/uImage,wnr854t)
 ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),y)  # nothing more to do for a ramdisk build
$(call Image/BuildKernel/JFFS2uImage,wnr854t,$(ERASE_SIZE_WNR854T),$(UIMAGE_FILE_NAME_WNR854T))
$(call Image/Default/FileSizeCheck,$(KDIR)/wnr854t-uImage.jffs2,$(shell expr $(KERNEL_MTD_SIZE) \* 1024))
 endif

 ## Linksys WRT350N v2: mach id 1633 (0x0661)
$(call Image/BuildKernel/ARM/zImage,wrt350nv2,"\x06\x1c\xa0\xe3\x61\x10\x81\xe3")
$(call Image/BuildKernel/ARM/uImage,wrt350nv2)
 ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),y)  # nothing more to do for a ramdisk build
$(call Image/Default/FileSizeCheck,$(KDIR)/wrt350nv2-uImage,$(shell expr $(KERNEL_MTD_SIZE) \* 1024))
 endif
endef

define Image/BuildKernel/ARM/zImage
 # merge machine id and regular zImage into one file
 # parameters: 1 = machine name, 2 = machine id as string in quotes
	# $(BOARD) kernel zImage for $(1)
	echo -en $(2) > '$(KDIR)/$(1)-zImage'
	cat '$(LINUX_DIR)/arch/arm/boot/zImage' >> '$(KDIR)/$(1)-zImage'
	cp '$(KDIR)/$(1)-zImage' '$(BIN_DIR)/openwrt-$(1)-zImage'
endef

define Image/BuildKernel/ARM/uImage
 # create uImage from zImage
 # parameters: 1 = machine name
	# $(BOARD) kernel uImage for $(1)
	'$(STAGING_DIR_HOST)/bin/mkimage' -A arm -O linux -T kernel \
	-C none -a 0x00008000 -e 0x00008000 -n 'Linux-$(LINUX_VERSION)' \
	-d '$(KDIR)/$(1)-zImage' '$(KDIR)/$(1)-uImage'
	cp '$(KDIR)/$(1)-uImage' '$(BIN_DIR)/openwrt-$(1)-uImage'
endef

define Image/BuildKernel/JFFS2uImage
 # create JFFS2 partition with uImage file (result is already padded to erase size)
 # parameters: 1 = machine name, 2 = erase size in KiB, 3 = uImage file name
	# $(BOARD) kernel uImage for $(1) in JFFS2-$(2)k partition
	rm -rf '$(TMP_DIR)/$(1)_jffs2_uimage'
	mkdir '$(TMP_DIR)/$(1)_jffs2_uimage'
	cp '$(KDIR)/$(1)-uImage' '$(TMP_DIR)/$(1)_jffs2_uimage/$(3)'
	$(STAGING_DIR_HOST)/bin/mkfs.jffs2 --compression-mode=none --pad --little-endian --squash -e $(2)KiB -o '$(KDIR)/$(1)-uImage.jffs2' -d '$(TMP_DIR)/$(1)_jffs2_uimage'
	rm -rf '$(TMP_DIR)/$(1)_jffs2_uimage'
endef

define Image/Default/FileSizeCheck
 # parameters: 1 = file path, 2 = maximum size in bytes
	[ `stat -c %s '$(1)'` -le $(2) ] || { echo '   ERROR: $(1) too big (> $(2) bytes)'; exit 1; }
endef


###
### Image/Build
###

define Image/Build
### Dummy comment for indented calls of Image/Build with $(1)

 ## Prepare rootfs
$(call Image/Build/$(1),$(1))

 ## Netgear WNR854T
$(call Image/Build/Default,$(1),wnr854t,$(ERASE_SIZE_WNR854T),$(KERNEL_MTD_SIZE),.jffs2,NG_WNR854T)

 ## Linksys WRT350N v2
$(call Image/Build/Linksys/wrt350nv2,$(1),wrt350nv2,$(ERASE_SIZE_WRT350Nv2),$(KERNEL_MTD_SIZE),)
endef

define Image/Build/squashfs
$(call prepare_generic_squashfs,$(KDIR)/root.squashfs)
	cp '$(KDIR)/root.squashfs' '$(BIN_DIR)/$(IMG_PREFIX)-root.squashfs'
endef

## generate defines for all JFFS2 block sizes
define Image/Build/jffs2/sub
 $(eval define Image/Build/jffs2-$(1)
	cp '$$(KDIR)/root.jffs2-$(1)' '$$(BIN_DIR)/$$(IMG_PREFIX)-root.jffs2-$(1)'
 endef)
endef

$(foreach SZ,$(JFFS2_BLOCKSIZE),$(call Image/Build/jffs2/sub,$(SZ)))

define Image/Build/Default
 # parameters: 1 = rootfs type, 2 = machine name, 3 = erase size in KiB, 4 = kernel mtd size in KiB, 5 = kernel file suffix, 6 = header
 ifeq ($(findstring jffs2-,$(1)),jffs2-)  # JFFS2: build only image fitting to erase size
  ifeq ($(1),jffs2-$(3)k)
$(call Image/Build/Default/sysupgrade,$(1),$(2),$(4),$(5))
$(call Image/Build/Default/factory,$(1),$(2),$(6))
  endif
 else
  ifeq ($(1),ext4)  # EXT4: ignore
   # do nothing
  else  # do all other images
$(call Image/Build/Default/sysupgrade,$(1),$(2),$(4),$(5))
$(call Image/Build/Default/factory,$(1),$(2),$(6))
  endif
 endif
endef

define Image/Build/Default/sysupgrade
 # parameters: 1 = rootfs type, 2 = machine name, 3 = pad size in KiB (kernel mtd size or erase size), 4 = kernel file suffix
	# $(BOARD) $(1) sysupgrade image for $(2)
	( \
		dd if='$(KDIR)/$(2)-uImage$(4)' bs=$(3)k conv=sync; \
		dd if='$(KDIR)/root.$(1)'; \
	) > '$(BIN_DIR)/openwrt-$(2)-$(1)-sysupgrade.img'
endef

define Image/Build/Default/factory
 # parameters: 1 = rootfs type, 2 = machine name, 3 = header
	# $(BOARD) $(1) factory upgrade image for $(2)
	'$(STAGING_DIR_HOST)/bin/add_header' $(3) '$(BIN_DIR)/openwrt-$(2)-$(1)-sysupgrade.img' '$(BIN_DIR)/openwrt-$(2)-$(1)-factory.img'
endef

##
## Image/Build/Linksys
##

define Image/Build/Linksys/wrt350nv2
 # parameters: 1 = rootfs type, 2 = machine name, 3 = erase size in KiB, 4 = kernel mtd size in KiB, 5 = kernel file suffix
 ifeq ($(findstring jffs2-,$(1)),jffs2-)  # JFFS2: build only image fitting to erase size
  ifeq ($(1),jffs2-$(3)k)
$(call Image/Build/Default/sysupgrade,$(1),$(2),$(4),$(5))
$(call Image/Build/Linksys/wrt350nv2-builder,$(1),$(2))
  endif
 else
  ifeq ($(1),ext4)  # EXT4: ignore
   # do nothing
  else  # do all other images
$(call Image/Build/Default/sysupgrade,$(1),$(2),$(4),$(5))
$(call Image/Build/Linksys/wrt350nv2-builder,$(1),$(2))
  endif
 endif
endef

define Image/Build/Linksys/wrt350nv2-builder
 # parameters: 1 = rootfs type, 2 = machine name
	# $(BOARD) $(1) factory and recovery image for $(2) via wrt350nv2-builder
	rm -rf '$(TMP_DIR)/$(2)_factory'
	mkdir '$(TMP_DIR)/$(2)_factory'
 # create parameter file
	echo ':image 0 $(BIN_DIR)/openwrt-$(2)-$(1)-sysupgrade.img' > '$(TMP_DIR)/$(2)_factory/$(2).par'
	[ ! -f '$(STAGING_DIR_HOST)/share/wrt350nv2-builder/u-boot.bin' ] || ( \
		echo ':u-boot 0 $(STAGING_DIR_HOST)/share/wrt350nv2-builder/u-boot.bin' >> '$(TMP_DIR)/$(2)_factory/$(2).par'; \
	)
	echo '#version 0x2020' >> '$(TMP_DIR)/$(2)_factory/$(2).par'
 # create bin file for recovery and factory image
	( \
		cd '$(TMP_DIR)/$(2)_factory'; \
		'$(STAGING_DIR_HOST)/bin/wrt350nv2-builder' -b '$(TMP_DIR)/$(2)_factory/$(2).par'; \
	)
 # copy bin file as recovery image
	$(CP) '$(TMP_DIR)/$(2)_factory/wrt350n.bin' '$(BIN_DIR)/openwrt-$(2)-$(1)-recovery.bin'
 # create factory image for stock firmware update mechanism
	( \
		cd '$(TMP_DIR)/$(2)_factory'; \
		zip 'wrt350n.zip' 'wrt350n.bin'; \
	)
	'$(STAGING_DIR_HOST)/bin/wrt350nv2-builder' -z '$(TMP_DIR)/$(2)_factory/wrt350n.zip' '$(BIN_DIR)/openwrt-$(2)-$(1)-factory.img'
	rm -rf '$(TMP_DIR)/$(2)_factory'
endef


###
### Image/PreReq
###

## Dependency for WRT350N v2 factory image
$(eval $(call RequireCommand,zip, \
	Please install zip. \
))