├── .gitignore ├── kernel ├── config.d │ ├── zz-version │ ├── 20-lentin │ ├── 21-systemd │ ├── 31-security │ ├── 70-library-routines │ ├── 32-crypto │ └── 30-filesystem ├── Makefile └── dts │ └── kirkwood-dns320l.dts ├── tools ├── fancontrol │ ├── fancontrol_default │ ├── fancontrol.service │ └── fancontrol.sh ├── hddwatch │ ├── hddwatch.service │ └── hddwatch.sh ├── device_failure.service ├── device_poweroff.service ├── device_ready.service ├── Makefile └── mcu │ ├── mcu_commands │ └── mcu_communicate.py ├── etc └── watchdog.conf └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | kernel/linux-* 2 | kernel/tmp/* 3 | 4 | tools/tmp/* 5 | 6 | *.deb 7 | -------------------------------------------------------------------------------- /kernel/config.d/zz-version: -------------------------------------------------------------------------------- 1 | 2 | CONFIG_LOCALVERSION="-dns320l" 3 | CONFIG_LOCALVERSION_AUTO=y 4 | -------------------------------------------------------------------------------- /tools/fancontrol/fancontrol_default: -------------------------------------------------------------------------------- 1 | 2 | LOW_THRESHOLD=30 3 | HIGH_THRESHOLD=50 4 | HYSTERESIS=3 5 | 6 | DEBUG=false -------------------------------------------------------------------------------- /tools/hddwatch/hddwatch.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Watch HDDs for reallocated sectors 3 | OnFailure=device_failure.service 4 | 5 | [Service] 6 | Restart=always 7 | ExecStart=/usr/bin/hddwatch -------------------------------------------------------------------------------- /tools/device_failure.service: -------------------------------------------------------------------------------- 1 | 2 | [Unit] 3 | Description=Let the power led blink, when the fancontrol fails 4 | 5 | [Service] 6 | Type=oneshot 7 | ExecStart=/usr/bin/mcu_communicate POWER_LED_FLASH 8 | -------------------------------------------------------------------------------- /tools/fancontrol/fancontrol.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Fan controller 3 | OnFailure=device_failure.service 4 | 5 | [Service] 6 | Restart=always 7 | ExecStart=/usr/bin/fancontrol 8 | 9 | [Install] 10 | WantedBy=multi-user.target 11 | -------------------------------------------------------------------------------- /tools/device_poweroff.service: -------------------------------------------------------------------------------- 1 | 2 | [Unit] 3 | Description=Poweroff the device after shutdown 4 | Before=shutdown.target halt.target 5 | 6 | [Service] 7 | type=oneshot 8 | ExecStart=/usr/bin/mcu_communicate DEVICE_POWEROFF 9 | 10 | [Install] 11 | WantedBy=poweroff.target halt.target -------------------------------------------------------------------------------- /tools/device_ready.service: -------------------------------------------------------------------------------- 1 | 2 | [Unit] 3 | Description=Tell MCU that the device is ready 4 | Requires=fancontrol.service hddwatch.service 5 | After=fancontrol.service hddwatch.service 6 | 7 | [Service] 8 | Type=oneshot 9 | ExecStart=/usr/bin/mcu_communicate DEVICE_READY 10 | 11 | [Install] 12 | WantedBy=multi-user.target -------------------------------------------------------------------------------- /kernel/config.d/20-lentin: -------------------------------------------------------------------------------- 1 | 2 | # Modifications by Jamie Lentin 3 | # taken from http://jamie.lentin.co.uk/devices/dlink-dns325/keeping-original-firmware/#appendix-compiling-a-kernel 4 | 5 | CONFIG_USE_OF=y 6 | CONFIG_ARM_APPENDED_DTB=y 7 | CONFIG_ARM_ATAG_DTB_COMPAT=y 8 | CONFIG_ARM_ATAG_DTB_COMPAT_CMDLINE_FROM_BOOTLOADER=y 9 | CONFIG_SERIAL_OF_PLATFORM=y 10 | CONFIG_HWMON=y 11 | CONFIG_GPIOLIB=y 12 | CONFIG_SENSORS_GPIO_FAN=y 13 | CONFIG_THERMAL=y -------------------------------------------------------------------------------- /kernel/config.d/21-systemd: -------------------------------------------------------------------------------- 1 | 2 | # Settings for systemd 3 | # taken from https://wiki.gentoo.org/wiki/Systemd 4 | 5 | CONFIG_CGROUPS=y 6 | CONFIG_FHANDLE=y 7 | CONFIG_SYSFS_DEPRECATED=n 8 | CONFIG_EXPERT=y 9 | CONFIG_EPOLL=y 10 | CONFIG_SIGNALFD=y 11 | CONFIG_TIMERFD=y 12 | CONFIG_NET=y 13 | CONFIG_DEVTMPFS=yo 14 | CONFIG_INOTIFY_USER=y 15 | CONFIG_PROC_FS=y 16 | CONFIG_SYSFS=y 17 | CONFIG_NAMESPACES=y 18 | CONFIG_NET_NS=y 19 | CONFIG_BLOCK=y 20 | CONFIG_BLK_DEV_BSG=y 21 | CONFIG_SECCOMP=y 22 | CONFIG_IPV6=y 23 | CONFIG_UEVENT_HELPER_PATH="" 24 | CONFIG_FW_LOADER_USER_HELPER_FALLBACK=n 25 | CONFIG_AUTOFS4_FS=y 26 | CONFIG_TMPFS=y 27 | CONFIG_TMPFS_POSIX_ACL=y 28 | CONFIG_TMPFS_XATTR=y 29 | -------------------------------------------------------------------------------- /tools/hddwatch/hddwatch.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | while true; do 4 | for HDD in 1 2; do 5 | DEV=$(find /sys/devices/platform/ocp@f1000000/f1080000.sata/ata${HDD}/ -regex ".*/sd[a-z]$" -printf %f) 6 | REALLOC=$(smartctl -A /dev/${DEV} | grep Reallocated_Sector_Ct | awk '{print $10}') 7 | 8 | if [ "$REALLOC" != "0" ]; then 9 | >&2 echo "Harddisk ${HDD} is about to fail!" 10 | echo default-on > /sys/class/leds/hdd${HDD}_orange/trigger 11 | else 12 | echo "No reallocated sectors for HDD ${HDD}" 13 | echo none > /sys/class/leds/hdd${HDD}_orange/trigger 14 | fi 15 | done 16 | 17 | sleep 15m 18 | done 19 | -------------------------------------------------------------------------------- /kernel/config.d/31-security: -------------------------------------------------------------------------------- 1 | 2 | # 3 | # Security options 4 | # 5 | CONFIG_KEYS=y 6 | # CONFIG_PERSISTENT_KEYRINGS is not set 7 | # CONFIG_BIG_KEYS is not set 8 | # CONFIG_ENCRYPTED_KEYS is not set 9 | CONFIG_KEYS_DEBUG_PROC_KEYS=y 10 | # CONFIG_SECURITY_DMESG_RESTRICT is not set 11 | CONFIG_SECURITY=y 12 | CONFIG_SECURITYFS=y 13 | CONFIG_SECURITY_NETWORK=y 14 | CONFIG_SECURITY_NETWORK_XFRM=y 15 | CONFIG_SECURITY_PATH=y 16 | CONFIG_LSM_MMAP_MIN_ADDR=32768 17 | CONFIG_SECURITY_SELINUX=y 18 | # CONFIG_SECURITY_SELINUX_BOOTPARAM is not set 19 | # CONFIG_SECURITY_SELINUX_DISABLE is not set 20 | CONFIG_SECURITY_SELINUX_DEVELOP=y 21 | CONFIG_SECURITY_SELINUX_AVC_STATS=y 22 | CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1 23 | # CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set 24 | # CONFIG_SECURITY_SMACK is not set 25 | # CONFIG_SECURITY_TOMOYO is not set 26 | # CONFIG_SECURITY_APPARMOR is not set 27 | CONFIG_SECURITY_YAMA=y 28 | CONFIG_SECURITY_YAMA_STACKED=y 29 | # CONFIG_IMA is not set 30 | # CONFIG_EVM is not set 31 | # CONFIG_DEFAULT_SECURITY_SELINUX is not set 32 | # CONFIG_DEFAULT_SECURITY_YAMA is not set 33 | CONFIG_DEFAULT_SECURITY_DAC=y 34 | CONFIG_DEFAULT_SECURITY="" 35 | CONFIG_XOR_BLOCKS=m 36 | CONFIG_ASYNC_CORE=m 37 | CONFIG_ASYNC_MEMCPY=m 38 | CONFIG_ASYNC_XOR=m 39 | CONFIG_ASYNC_PQ=m 40 | CONFIG_ASYNC_RAID6_RECOV=m 41 | CONFIG_CRYPTO=y -------------------------------------------------------------------------------- /etc/watchdog.conf: -------------------------------------------------------------------------------- 1 | #ping = 172.31.14.1 2 | #ping = 172.26.1.255 3 | #interface = eth0 4 | #file = /var/log/messages 5 | #change = 1407 6 | 7 | # Uncomment to enable test. Setting one of these values to '0' disables it. 8 | # These values will hopefully never reboot your machine during normal use 9 | # (if your machine is really hung, the loadavg will go much higher than 25) 10 | #max-load-1 = 24 11 | #max-load-5 = 18 12 | #max-load-15 = 12 13 | 14 | # Note that this is the number of pages! 15 | # To get the real size, check how large the pagesize is on your machine. 16 | #min-memory = 1 17 | 18 | #repair-binary = /usr/sbin/repair 19 | #repair-timeout = 20 | #test-binary = 21 | #test-timeout = 22 | 23 | watchdog-device = /dev/watchdog 24 | watchdog-timeout = 60 25 | interval = 15 26 | 27 | # Defaults compiled into the binary 28 | #temperature-device = 29 | #max-temperature = 120 30 | 31 | # Defaults compiled into the binary 32 | #admin = root 33 | #interval = 1 34 | #logtick = 1 35 | #log-dir = /var/log/watchdog 36 | 37 | # This greatly decreases the chance that watchdog won't be scheduled before 38 | # your machine is really loaded 39 | realtime = yes 40 | priority = 20 41 | 42 | # Check if syslogd is still running by enabling the following line 43 | #pidfile = /var/run/syslogd.pid -------------------------------------------------------------------------------- /kernel/config.d/70-library-routines: -------------------------------------------------------------------------------- 1 | 2 | # 3 | # Library routines 4 | # 5 | CONFIG_RAID6_PQ=m 6 | CONFIG_BITREVERSE=y 7 | CONFIG_GENERIC_STRNCPY_FROM_USER=y 8 | CONFIG_GENERIC_STRNLEN_USER=y 9 | CONFIG_GENERIC_NET_UTILS=y 10 | CONFIG_GENERIC_PCI_IOMAP=y 11 | CONFIG_GENERIC_IO=y 12 | CONFIG_PERCPU_RWSEM=y 13 | CONFIG_ARCH_USE_CMPXCHG_LOCKREF=y 14 | CONFIG_CRC_CCITT=m 15 | CONFIG_CRC16=y 16 | CONFIG_CRC_T10DIF=m 17 | CONFIG_CRC_ITU_T=m 18 | CONFIG_CRC32=y 19 | # CONFIG_CRC32_SELFTEST is not set 20 | CONFIG_CRC32_SLICEBY8=y 21 | # CONFIG_CRC32_SLICEBY4 is not set 22 | # CONFIG_CRC32_SARWATE is not set 23 | # CONFIG_CRC32_BIT is not set 24 | CONFIG_CRC7=m 25 | CONFIG_LIBCRC32C=m 26 | # CONFIG_CRC8 is not set 27 | CONFIG_AUDIT_GENERIC=y 28 | # CONFIG_AUDIT_ARCH_COMPAT_GENERIC is not set 29 | # CONFIG_RANDOM32_SELFTEST is not set 30 | CONFIG_ZLIB_INFLATE=y 31 | CONFIG_ZLIB_DEFLATE=y 32 | CONFIG_LZO_COMPRESS=y 33 | CONFIG_LZO_DECOMPRESS=y 34 | CONFIG_LZ4_COMPRESS=m 35 | CONFIG_LZ4HC_COMPRESS=m 36 | CONFIG_LZ4_DECOMPRESS=m 37 | CONFIG_XZ_DEC=y 38 | # CONFIG_XZ_DEC_X86 is not set 39 | # CONFIG_XZ_DEC_POWERPC is not set 40 | # CONFIG_XZ_DEC_IA64 is not set 41 | CONFIG_XZ_DEC_ARM=y 42 | CONFIG_XZ_DEC_ARMTHUMB=y 43 | # CONFIG_XZ_DEC_SPARC is not set 44 | CONFIG_XZ_DEC_BCJ=y 45 | # CONFIG_XZ_DEC_TEST is not set 46 | CONFIG_DECOMPRESS_GZIP=y 47 | CONFIG_DECOMPRESS_BZIP2=y 48 | CONFIG_DECOMPRESS_LZMA=y 49 | CONFIG_DECOMPRESS_XZ=y 50 | CONFIG_GENERIC_ALLOCATOR=y 51 | CONFIG_BCH=y 52 | CONFIG_TEXTSEARCH=y 53 | CONFIG_TEXTSEARCH_KMP=m 54 | CONFIG_TEXTSEARCH_BM=m 55 | CONFIG_TEXTSEARCH_FSM=m 56 | CONFIG_BTREE=y 57 | CONFIG_ASSOCIATIVE_ARRAY=y 58 | CONFIG_HAS_IOMEM=y 59 | CONFIG_HAS_IOPORT_MAP=y 60 | CONFIG_HAS_DMA=y 61 | CONFIG_CHECK_SIGNATURE=y 62 | CONFIG_DQL=y 63 | CONFIG_NLATTR=y 64 | CONFIG_GENERIC_ATOMIC64=y 65 | CONFIG_ARCH_HAS_ATOMIC64_DEC_IF_POSITIVE=y 66 | CONFIG_LRU_CACHE=m 67 | CONFIG_AVERAGE=y 68 | CONFIG_CORDIC=m 69 | # CONFIG_DDR is not set 70 | CONFIG_LIBFDT=y 71 | CONFIG_OID_REGISTRY=m 72 | CONFIG_FONT_SUPPORT=m 73 | # CONFIG_FONTS is not set 74 | CONFIG_FONT_8x8=y 75 | CONFIG_FONT_8x16=y 76 | # CONFIG_VIRTUALIZATION is not set -------------------------------------------------------------------------------- /tools/fancontrol/fancontrol.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | if [ -e /etc/default/fancontrol ]; then 4 | . /etc/default/fancontrol 5 | else 6 | >&2 echo "No config found, taking default values" 7 | 8 | LOW_THRESHOLD=30 9 | HIGH_THRESHOLD=50 10 | HYSTERESIS=3 11 | 12 | DEBUG=true 13 | fi 14 | 15 | 16 | CUR_FAN_SPEED=FAN_INIT 17 | 18 | while true; do 19 | MAX_TEMP=$(mcu_communicate THERMAL_STATUS) 20 | if [ "$?" -ne 0 ]; then 21 | MAX_TEMP=99 22 | >&2 echo "Could not determine CPU temperature, assuming worst case" 23 | else 24 | $DEBUG && echo "CPU temperature is ${MAX_TEMP}" 25 | fi 26 | 27 | for HDD in 1 2; do 28 | DEV=$(find /sys/devices/platform/ocp@f1000000/f1080000.sata/ata${HDD}/ -regex ".*/sd[a-z]$" -printf %f) 29 | if [ -n "$DEV" ]; then 30 | HDD_TEMP=$(hddtemp -n /dev/${DEV}) 31 | 32 | if [ "$?" -ne 0 ]; then 33 | MAX_TEMP=99 34 | >&2 echo "Could not determine HDD ${HDD} temperature, assuming worst case" 35 | elif [ -z "$HDD_TEMP" ]; then 36 | $DEBUG && echo "HDD ${HDD} temperature unknown, device asleep?" 37 | else 38 | $DEBUG && echo "HDD ${HDD} temperature is ${HDD_TEMP}" 39 | if [ "$HDD_TEMP" -gt "$MAX_TEMP" ]; then 40 | MAX_TEMP=$HDD_TEMP 41 | fi 42 | fi 43 | fi 44 | done 45 | 46 | case "$CUR_FAN_SPEED" in 47 | FAN_STOP) 48 | [ "$MAX_TEMP" -gt "$((LOW_THRESHOLD +HYSTERESIS))" ] && NEW_FAN_SPEED=FAN_HALF 49 | [ "$MAX_TEMP" -gt "$((HIGH_THRESHOLD+HYSTERESIS))" ] && NEW_FAN_SPEED=FAN_FULL 50 | ;; 51 | 52 | FAN_HALF) 53 | [ "$MAX_TEMP" -lt "$((LOW_THRESHOLD -HYSTERESIS))" ] && NEW_FAN_SPEED=FAN_STOP 54 | [ "$MAX_TEMP" -gt "$((HIGH_THRESHOLD+HYSTERESIS))" ] && NEW_FAN_SPEED=FAN_FULL 55 | ;; 56 | 57 | FAN_FULL) 58 | [ "$MAX_TEMP" -lt "$((HIGH_THRESHOLD-HYSTERESIS))" ] && NEW_FAN_SPEED=FAN_HALF 59 | [ "$MAX_TEMP" -lt "$((LOW_THRESHOLD -HYSTERESIS))" ] && NEW_FAN_SPEED=FAN_STOP 60 | ;; 61 | FAN_INIT) 62 | NEW_FAN_SPEED=FAN_FULL 63 | [ "$MAX_TEMP" -lt "$((HIGH_THRESHOLD))" ] && NEW_FAN_SPEED=FAN_HALF 64 | [ "$MAX_TEMP" -lt "$((LOW_THRESHOLD))" ] && NEW_FAN_SPEED=FAN_STOP 65 | ;; 66 | 67 | esac 68 | 69 | if [ "$NEW_FAN_SPEED" != "$CUR_FAN_SPEED" ]; then 70 | CUR_FAN_SPEED=$NEW_FAN_SPEED 71 | echo "Adjusting fan speed, new fan speed is ${NEW_FAN_SPEED}" 72 | 73 | mcu_communicate $CUR_FAN_SPEED || exit 1 74 | fi 75 | sleep 15s 76 | done 77 | -------------------------------------------------------------------------------- /kernel/config.d/32-crypto: -------------------------------------------------------------------------------- 1 | 2 | # 3 | # Crypto core or helper 4 | # 5 | # CONFIG_CRYPTO_FIPS is not set 6 | CONFIG_CRYPTO_ALGAPI=y 7 | CONFIG_CRYPTO_ALGAPI2=y 8 | CONFIG_CRYPTO_AEAD=m 9 | CONFIG_CRYPTO_AEAD2=y 10 | CONFIG_CRYPTO_BLKCIPHER=m 11 | CONFIG_CRYPTO_BLKCIPHER2=y 12 | CONFIG_CRYPTO_HASH=y 13 | CONFIG_CRYPTO_HASH2=y 14 | CONFIG_CRYPTO_RNG=m 15 | CONFIG_CRYPTO_RNG2=y 16 | CONFIG_CRYPTO_PCOMP=m 17 | CONFIG_CRYPTO_PCOMP2=y 18 | CONFIG_CRYPTO_MANAGER=y 19 | CONFIG_CRYPTO_MANAGER2=y 20 | # CONFIG_CRYPTO_USER is not set 21 | # CONFIG_CRYPTO_MANAGER_DISABLE_TESTS is not set 22 | CONFIG_CRYPTO_GF128MUL=m 23 | CONFIG_CRYPTO_NULL=m 24 | CONFIG_CRYPTO_WORKQUEUE=y 25 | # CONFIG_CRYPTO_CRYPTD is not set 26 | CONFIG_CRYPTO_AUTHENC=m 27 | CONFIG_CRYPTO_TEST=m 28 | 29 | # 30 | # Authenticated Encryption with Associated Data 31 | # 32 | CONFIG_CRYPTO_CCM=m 33 | CONFIG_CRYPTO_GCM=m 34 | CONFIG_CRYPTO_SEQIV=m 35 | 36 | # 37 | # Block modes 38 | # 39 | CONFIG_CRYPTO_CBC=m 40 | CONFIG_CRYPTO_CTR=m 41 | CONFIG_CRYPTO_CTS=m 42 | CONFIG_CRYPTO_ECB=m 43 | CONFIG_CRYPTO_LRW=m 44 | CONFIG_CRYPTO_PCBC=m 45 | CONFIG_CRYPTO_XTS=m 46 | 47 | # 48 | # Hash modes 49 | # 50 | CONFIG_CRYPTO_CMAC=m 51 | CONFIG_CRYPTO_HMAC=m 52 | CONFIG_CRYPTO_XCBC=m 53 | CONFIG_CRYPTO_VMAC=m 54 | 55 | # 56 | # Digest 57 | # 58 | CONFIG_CRYPTO_CRC32C=m 59 | CONFIG_CRYPTO_CRC32=m 60 | CONFIG_CRYPTO_CRCT10DIF=m 61 | CONFIG_CRYPTO_GHASH=m 62 | CONFIG_CRYPTO_MD4=m 63 | CONFIG_CRYPTO_MD5=y 64 | CONFIG_CRYPTO_MICHAEL_MIC=m 65 | CONFIG_CRYPTO_RMD128=m 66 | CONFIG_CRYPTO_RMD160=m 67 | CONFIG_CRYPTO_RMD256=m 68 | CONFIG_CRYPTO_RMD320=m 69 | CONFIG_CRYPTO_SHA1=m 70 | CONFIG_CRYPTO_SHA1_ARM=m 71 | CONFIG_CRYPTO_SHA256=m 72 | CONFIG_CRYPTO_SHA512=m 73 | CONFIG_CRYPTO_TGR192=m 74 | CONFIG_CRYPTO_WP512=m 75 | 76 | # 77 | # Ciphers 78 | # 79 | CONFIG_CRYPTO_AES=y 80 | CONFIG_CRYPTO_AES_ARM=m 81 | CONFIG_CRYPTO_ANUBIS=m 82 | CONFIG_CRYPTO_ARC4=m 83 | CONFIG_CRYPTO_BLOWFISH=m 84 | CONFIG_CRYPTO_BLOWFISH_COMMON=m 85 | CONFIG_CRYPTO_CAMELLIA=m 86 | CONFIG_CRYPTO_CAST_COMMON=m 87 | CONFIG_CRYPTO_CAST5=m 88 | CONFIG_CRYPTO_CAST6=m 89 | CONFIG_CRYPTO_DES=m 90 | CONFIG_CRYPTO_FCRYPT=m 91 | CONFIG_CRYPTO_KHAZAD=m 92 | CONFIG_CRYPTO_SALSA20=m 93 | CONFIG_CRYPTO_SEED=m 94 | CONFIG_CRYPTO_SERPENT=m 95 | CONFIG_CRYPTO_TEA=m 96 | CONFIG_CRYPTO_TWOFISH=m 97 | CONFIG_CRYPTO_TWOFISH_COMMON=m 98 | 99 | # 100 | # Compression 101 | # 102 | CONFIG_CRYPTO_DEFLATE=y 103 | CONFIG_CRYPTO_ZLIB=m 104 | CONFIG_CRYPTO_LZO=y 105 | CONFIG_CRYPTO_LZ4=m 106 | CONFIG_CRYPTO_LZ4HC=m 107 | 108 | # 109 | # Random Number Generation 110 | # 111 | CONFIG_CRYPTO_ANSI_CPRNG=m 112 | CONFIG_CRYPTO_USER_API=m 113 | CONFIG_CRYPTO_USER_API_HASH=m 114 | CONFIG_CRYPTO_USER_API_SKCIPHER=m 115 | CONFIG_CRYPTO_HW=y 116 | CONFIG_CRYPTO_DEV_MV_CESA=m 117 | CONFIG_CRYPTO_DEV_HIFN_795X=m 118 | CONFIG_CRYPTO_DEV_HIFN_795X_RNG=y 119 | # CONFIG_ASYMMETRIC_KEY_TYPE is not set 120 | CONFIG_BINARY_PRINTF=y -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Linux on D-Link DNS-320L 2 | 3 | **Warning:** I take no responsibility if you screw up your device following these instructions. Proceed at your own risk and use your own head. This will probably void warranty. 4 | 5 | I have tested these instructions successfully with: 6 | * linux-3.14.43 7 | * linux-4.0.4 8 | 9 | Install cross compiler toolchain 10 | -------------------------------- 11 | 12 | * [Debian Jessie][deb-cross] 13 | ```bash 14 | $ cat - < install 64 | ``` 65 | which installs the uImage and modules into the appropriate directories under $DESTDIR, or 66 | ```bash 67 | $ make deb 68 | ``` 69 | which creates a Debian package containing the uImage and modules. 70 | 71 | 72 | **Remark:** These make targets try to find the latest kernel sources via `ls -1 -d */ | sort -r | head -n 1`. If you want to build another kernel version, you have to provide the path via `SRC_DIR`, i.e. `make SRC_DIR=linux-X.XX.XX/ config|build|install|deb`. 73 | 74 | **Attention**: The installation of the package does not flash the image. You have to do this on your own! You should, at first, try to boot your kernel using a USB Stick (see [Booting the NAS](http://jamie.lentin.co.uk/devices/dlink-dns325/keeping-original-firmware/#booting-the-nas)). Afterwards you may flash the kernel to NAND (see [Installing kernel to NAND](http://jamie.lentin.co.uk/devices/dlink-dns325/keeping-original-firmware/#installing-kernel-to-nand)). 75 | 76 | MCU and tools 77 | ------------- 78 | TODO 79 | 80 | 81 | 82 | 83 | References 84 | ---------- 85 | * [Linux on the D-Link DNS-320L][boe] 86 | * [Debian @ Dlink DNS-327L: The guide][nec] 87 | * [Debian Linux on the D-Link DNS-320 & DNS-325 NAS][len] 88 | 89 | 90 | [nec]: http://ncrmnt.org/wp/2015/02/15/debian-dlink-dns-327l-the-guide/ 91 | [boe]: http://www.aboehler.at/doku/doku.php/projects:dns320l 92 | [len]: http://jamie.lentin.co.uk/devices/dlink-dns325/ 93 | -------------------------------------------------------------------------------- /tools/Makefile: -------------------------------------------------------------------------------- 1 | 2 | DESTDIR = / 3 | 4 | VERSION := $(shell git show -s --format=%ct) 5 | ifneq "$(shell git diff --shortstat 2> /dev/null | tail -n1)" "" 6 | VERSION := $(VERSION)-dirty 7 | endif 8 | 9 | .PHONY: help install install_tools install_systemd_config deb 10 | 11 | help: 12 | @echo 'Targets:' 13 | @echo ' install - Install scripts and systemd service files to $$DESTDIR' 14 | @echo ' install_tools - Install scripts to $$DESTDIR' 15 | @echo ' install_systemd_config - Install systemd service files to $$DESTDIR' 16 | @echo ' deb - Build Debian package' 17 | @echo ' (this target creates a temporary directory "tmp" to create' 18 | @echo ' the package)' 19 | @echo ' ' 20 | @echo 'The default value for $$DESTDIR is $(DESTDIR)' 21 | 22 | install: install_tools install_systemd_config 23 | 24 | install_tools: 25 | install -d $(DESTDIR)/usr/bin 26 | install -m 0755 mcu/mcu_communicate.py $(DESTDIR)/usr/bin/mcu_communicate 27 | install -m 0755 hddwatch/hddwatch.sh $(DESTDIR)/usr/bin/hddwatch 28 | install -m 0755 fancontrol/fancontrol.sh $(DESTDIR)/usr/bin/fancontrol 29 | install -d $(DESTDIR)/etc/default 30 | install fancontrol/fancontrol_default $(DESTDIR)/etc/default/fancontrol 31 | 32 | install_systemd_config: 33 | install -d $(DESTDIR)/lib/systemd/system 34 | install hddwatch/hddwatch.service $(DESTDIR)/lib/systemd/system 35 | install fancontrol/fancontrol.service $(DESTDIR)/lib/systemd/system 36 | install device_failure.service $(DESTDIR)/lib/systemd/system 37 | install device_ready.service $(DESTDIR)/lib/systemd/system 38 | install device_poweroff.service $(DESTDIR)/lib/systemd/system 39 | 40 | deb: TMP_DIR := $(abspath ./tmp/) 41 | deb: 42 | $(MAKE) -s DESTDIR=$(TMP_DIR) install 43 | $(MAKE) -s DESTDIR=$(TMP_DIR) deb_control 44 | dpkg -b $(TMP_DIR) dns320l-tools.deb 45 | 46 | deb_control: SIZE = $(shell du -sk $(DESTDIR) | cut -f1) 47 | deb_control: 48 | @install -d $(DESTDIR)/DEBIAN 49 | ifeq "$(wildcard $(DESTDIR)/DEBIAN/control)" "" 50 | @echo 'Package: dns320l-tools' > $(DESTDIR)/DEBIAN/control 51 | @echo 'Version: $(VERSION)' >> $(DESTDIR)/DEBIAN/control 52 | @echo 'Section: misc' >> $(DESTDIR)/DEBIAN/control 53 | @echo 'Priority: important' >> $(DESTDIR)/DEBIAN/control 54 | @echo 'Architecture: armel' >> $(DESTDIR)/DEBIAN/control 55 | @echo 'Installed-Size: $(SIZE)' >> $(DESTDIR)/DEBIAN/control 56 | @echo 'Maintainer: $(USER)' >> $(DESTDIR)/DEBIAN/control 57 | @echo 'Depends: systemd, hddtemp, python-serial' >> $(DESTDIR)/DEBIAN/control 58 | @echo 'Description: Tools for D-Link DNS-320L' >> $(DESTDIR)/DEBIAN/control 59 | 60 | editor $(DESTDIR)/DEBIAN/control 61 | else 62 | @echo 'Found control file, just updating version and size field' 63 | @sed -e 's/^Version: .*/Version: $(VERSION)/g' -i $(DESTDIR)/DEBIAN/control 64 | @sed -e 's/^Installed-Size:: .*/Installed-Size: $(SIZE)/g' -i $(DESTDIR)/DEBIAN/control 65 | endif 66 | 67 | ifeq "$(wildcard $(DESTDIR)/DEBIAN/postinst)" "" 68 | @echo 'systemctl enable device_ready.service' > $(DESTDIR)/DEBIAN/postinst 69 | @echo 'systemctl enable device_poweroff.service' >> $(DESTDIR)/DEBIAN/postinst 70 | @echo 'systemctl enable fancontrol.service' >> $(DESTDIR)/DEBIAN/postinst 71 | @chmod 755 $(DESTDIR)/DEBIAN/postinst 72 | endif 73 | 74 | ifeq "$(wildcard $(DESTDIR)/DEBIAN/prerm)" "" 75 | @echo 'systemctl disable device_ready.service' > $(DESTDIR)/DEBIAN/prerm 76 | @echo 'systemctl disable device_poweroff.service' >> $(DESTDIR)/DEBIAN/prerm 77 | @echo 'systemctl disable fancontrol.service' >> $(DESTDIR)/DEBIAN/prerm 78 | @chmod 755 $(DESTDIR)/DEBIAN/prerm 79 | endif 80 | 81 | ifeq "$(wildcard $(DESTDIR)/DEBIAN/conffiles)" "" 82 | @echo '/etc/default/fancontrol' > $(DESTDIR)/DEBIAN/conffiles 83 | endif 84 | -------------------------------------------------------------------------------- /kernel/Makefile: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | .PHONY: config build install deb deb_control 5 | 6 | ARCH = arm 7 | CROSS_COMPILE = arm-linux-gnueabi- 8 | CROSS_MAKE := $(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) 9 | 10 | 11 | ifndef DESTDIR 12 | DESTDIR := / 13 | else 14 | DESTDIR := $(abspath $(DESTDIR)) 15 | endif 16 | 17 | ifndef SRC_DIR 18 | SRC_DIR := $(shell ls -1 -d */ | grep -e '^linux-' | sort -r | head -n 1) 19 | endif 20 | SRC_DIR := $(abspath $(SRC_DIR)) 21 | 22 | ifneq "$(wildcard $(SRC_DIR)/.config)" "" 23 | RELEASE = $(shell $(CROSS_MAKE) -C $(SRC_DIR) -s kernelrelease) 24 | else 25 | RELEASE = noconfig 26 | endif 27 | 28 | 29 | help: 30 | @echo 'Targets:' 31 | @echo ' config - Generate .config file in $$SRC_DIR' 32 | @echo ' (this command takes the default config, adds the' 33 | @echo ' configuration in ./config.d and runs "make menuconfig")' 34 | @echo ' build - Build the uImage and modules in $$SRC_DIR' 35 | @echo ' install - Install uImage and modules to $$DESTDIR (default: /)' 36 | @echo ' deb - Build Debian package' 37 | @echo ' (this target invokes the "install" to install the' 38 | @echo ' uImage and modules to a temporary directory' 39 | @echo ' (./tmp/linux-image-$$RELEASE); you may modify the DEBIAN/control' 40 | @echo ' file under this directory and remake this target)' 41 | 42 | config: 43 | ifdef CONFIG 44 | cp $(CONFIG) $(SRC_DIR)/.config 45 | else ifneq "$(wildcard $(SRC_DIR)/arch/arm/configs/kirkwood_defconfig)" "" 46 | cp $(SRC_DIR)/arch/arm/configs/kirkwood_defconfig $(SRC_DIR)/.config 47 | else ifneq "$(wildcard $(SRC_DIR)/arch/arm/configs/mvebu_v5_defconfig)" "" 48 | cp $(SRC_DIR)/arch/arm/configs/mvebu_v5_defconfig $(SRC_DIR)/.config 49 | else 50 | $(error I don't know with what .config i should start) 51 | endif 52 | 53 | find ./config.d -type f -print0 | sort -z | xargs -0 awk 'FNR==1{print ""}1' >> $(SRC_DIR)/.config 54 | cp ./dts/kirkwood-dns320l.dts $(SRC_DIR)/arch/arm/boot/dts/ 55 | 56 | $(CROSS_MAKE) -C $(SRC_DIR) menuconfig 57 | 58 | build: 59 | $(CROSS_MAKE) -C $(SRC_DIR) -j8 zImage kirkwood-dns320l.dtb 60 | cat $(SRC_DIR)/arch/arm/boot/dts/kirkwood-dns320l.dtb >> $(SRC_DIR)/arch/arm/boot/zImage 61 | $(CROSS_MAKE) -C $(SRC_DIR) LOADADDR=0x00008000 uImage 62 | $(CROSS_MAKE) -C $(SRC_DIR) -j8 modules 63 | 64 | install: 65 | install -d $(DESTDIR)/boot 66 | install $(SRC_DIR)/arch/arm/boot/uImage $(DESTDIR)/boot/uImage-$(RELEASE) 67 | $(CROSS_MAKE) -C $(SRC_DIR) INSTALL_MOD_PATH=$(DESTDIR) modules_install 68 | 69 | deb: TMP_DIR := $(abspath ./tmp/linux-image-$(RELEASE)) 70 | deb: 71 | $(MAKE) -s DESTDIR=$(TMP_DIR) install 72 | $(MAKE) -s DESTDIR=$(TMP_DIR) deb_control 73 | dpkg -b $(TMP_DIR) linux-image-$(RELEASE).deb 74 | 75 | deb_control: VERSION = $(shell date +"%Y.%m.%d-%H%M") 76 | deb_control: SIZE = $(shell du -sk $(DESTDIR) | cut -f1) 77 | deb_control: 78 | ifeq "$(wildcard $(DESTDIR)/DEBIAN/control)" "" 79 | @install -d $(DESTDIR)/DEBIAN 80 | @echo 'Package: linux-image-$(RELEASE)' > $(DESTDIR)/DEBIAN/control 81 | @echo 'Version: $(VERSION)' >> $(DESTDIR)/DEBIAN/control 82 | @echo 'Section: kernel' >> $(DESTDIR)/DEBIAN/control 83 | @echo 'Priority: important' >> $(DESTDIR)/DEBIAN/control 84 | @echo 'Architecture: armel' >> $(DESTDIR)/DEBIAN/control 85 | @echo 'Installed-Size: $(SIZE)' >> $(DESTDIR)/DEBIAN/control 86 | @echo 'Maintainer: $(USER)' >> $(DESTDIR)/DEBIAN/control 87 | @echo 'Description: Linux kernel for D-Link DNS-320L' >> $(DESTDIR)/DEBIAN/control 88 | 89 | editor $(DESTDIR)/DEBIAN/control 90 | else 91 | @echo 'Found control file, just updating version and size field' 92 | @sed -e 's/^Version: .*/Version: $(VERSION)/g' -i $(DESTDIR)/DEBIAN/control 93 | @sed -e 's/^Installed-Size:: .*/Installed-Size: $(SIZE)/g' -i $(DESTDIR)/DEBIAN/control 94 | endif 95 | 96 | 97 | 98 | -------------------------------------------------------------------------------- /tools/mcu/mcu_commands: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | APREnableCmd = "\xfa\x03\x02\x01\x00\x00\xfb" 4 | APRDisableCmd = "\xfa\x03\x02\x00\x00\x00\xfb" 5 | APRStatusCmd = "\xfa\x03\x02\x02\x00\x00\xfb" 6 | 7 | 8 | WOLStatusEnableCmd = "\xfa\x03\x0a\x01\x00\x00\xfb" 9 | WOLStatusDisableCmd = "\xfa\x03\x0a\x00\x00\x00\xfb" 10 | WOLStatusGetCmd = "\xfa\x03\x0a\x02\x00\x00\xfb" 11 | RDateAndTimeCmd = "\xfa\x01\x08\x01\x01\x00\xfb" 12 | # Read RTC 13 | # 577 for(i=5;i<12;i++) 14 | # 578 { 15 | # 579 buf[i] = (buf[i] & 0x0f) + 10 * ((buf[i] & 0xf0) >> 4); 16 | # 580 } 17 | # 581 18 | # 582 strTime.tm_year = (100 + (int)buf[11]); 19 | # 583 strTime.tm_mon = buf[10]-1; 20 | # 584 strTime.tm_mday = buf[9]; 21 | # 585 strTime.tm_hour = buf[7]; 22 | # 586 strTime.tm_min = buf[6]; 23 | # 587 strTime.tm_sec = buf[5]; 24 | # 588 strTime.tm_isdst = -1; 25 | # 589 rtcTime = mktime(&strTime); 26 | # 590 strcpy(timeStr, ctime(&rtcTime)); 27 | # 591 // Retrieve system time 28 | # 592 sysTime = time(NULL); 29 | # 593 setTime.tv_sec = rtcTime; 30 | # 594 setTime.tv_usec = 0; 31 | 32 | import datetime 33 | import time 34 | def decodeDateTime(retval): 35 | assert retval[0] == StartByte 36 | assert retval[-1] == StopByte 37 | assert len(retval) == 13 38 | 39 | f = lambda a: (a & 0x0f) + 10 * ((a & 0xf0) >> 4) 40 | 41 | time_struct = [ord(char) for char in reversed(retval[5:11])] 42 | time_struct = map(f, time_struct) 43 | time_struct[0] += 2000 44 | #time_struct[1] -= 1 45 | 46 | return time.struct_time(time_struct + [0,0,-1]) 47 | 48 | def encodeDateTime(ts): 49 | assert isinstance(ts, time.struct_time) 50 | 51 | f = lambda a: ((a / 10) << 4) + (a % 10); 52 | 53 | time_struct = list(ts)[0:6] 54 | time_struct[0] -= 2000 55 | #time_struct[1] += 1 56 | time_struct = map(f, time_struct) 57 | 58 | cmd = list(WDateAndTimeCmd) 59 | cmd[5:11] = [chr(a) for a in reversed(time_struct)] 60 | return "".join(cmd) 61 | 62 | 63 | WAlarmEnableCmd = "\xfa\x01\x10\x02\x01\x01\xfb" 64 | WAlarmDisableCmd = "\xfa\x01\x10\x02\x01\x00\xfb" 65 | RAlarmMonthCmd = "\xfa\x01\x0a\x01\x01\x00\xfb" 66 | RAlarmDateCmd = "\xfa\x01\x0b\x01\x01\x00\xfb" 67 | RAlarmHourCmd = "\xfa\x01\x0c\x01\x01\x00\xfb" 68 | RAlarmSecondCmd = "\xfa\x01\x0e\x01\x01\x00\xfb" 69 | RAlarmMinuteCmd = "\xfa\x01\x0d\x01\x01\x00\xfb" 70 | RAlarmFlagCmd = "\xfa\x01\x0f\x01\x01\x00\xfb" 71 | WAlarmMonthCmd = "\xfa\x01\x0a\x02\x01\x00\xfb" 72 | WAlarmDateCmd = "\xfa\x01\x0b\x02\x01\x00\xfb" 73 | WAlarmHourCmd = "\xfa\x01\x0c\x02\x01\x00\xfb" 74 | WAlarmMinuteCmd = "\xfa\x01\x0d\x02\x01\x00\xfb" 75 | WAlarmSecondCmd = "\xfa\x01\x0e\x02\x01\x00\xfb" 76 | WDateAndTimeCmd = "\xfa\x01\x08\x02\x07\x17\x06\x21\x02\x10\x09\x13\xfb" 77 | # Write RTC 78 | # 543 for(i=0;i<13;i++) 79 | # 544 { 80 | # 545 cmdBuf[i] = WDateAndTimeCmd[i]; 81 | # 546 } 82 | # 547 sysTime = time(NULL); 83 | # 548 strSetTime = localtime(&sysTime); 84 | # 549 // Put the current local time into the command buffer 85 | # 550 cmdBuf[5] = (char)strSetTime->tm_sec; 86 | # 551 cmdBuf[6] = (char)strSetTime->tm_min; 87 | # 552 cmdBuf[7] = (char)strSetTime->tm_hour; 88 | # 553 cmdBuf[8] = (char)strSetTime->tm_wday; 89 | # 554 cmdBuf[9] = (char)strSetTime->tm_mday; 90 | # 555 cmdBuf[10] = (char)(strSetTime->tm_mon + 1); 91 | # 556 cmdBuf[11] = (char)(strSetTime->tm_year - 100); 92 | # 557 // And modify the values so that the MCU understands them... 93 | # 558 for(i=5;i<12;i++) 94 | # 559 { 95 | # 560 cmdBuf[i] = ((cmdBuf[i] / 10) << 4) + (cmdBuf[i] % 10); 96 | # 561 } -------------------------------------------------------------------------------- /tools/mcu/mcu_communicate.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | from __future__ import print_function 4 | 5 | import sys 6 | import serial 7 | import argparse 8 | import fcntl 9 | import time, datetime 10 | 11 | def warning(*objs): 12 | print(*objs, file = sys.stderr) 13 | 14 | START_BYTE = "\xfa" 15 | STOP_BYTE = "\xfb" 16 | ACK = "\xfa\x30\x00\x00\x00\x00\xfb" 17 | 18 | class MCUException(Exception): 19 | pass 20 | 21 | def empty_answer(retval): 22 | if not len(retval) == 0: 23 | raise MCUException('Expected empty answer, got {}'.format(retval.encode('hex'))) 24 | return "" 25 | 26 | THERMAL_TABLE = ( 27 | 116, 115, 114, 113, 112, 111, 110, 109, 28 | 108, 107, 106, 105, 104, 103, 102, 101, 29 | 100, 99, 98, 97, 96, 95, 94, 93, 30 | 92, 91, 90, 89, 88, 87, 86, 85, 31 | 84, 83, 82, 81, 80, 79, 78, 77, 32 | 76, 75, 74, 73, 72, 71, 70, 69, 33 | 68, 67, 66, 65, 65, 64, 63, 62, 34 | 62, 61, 61, 60, 59, 58, 58, 57, 35 | 56, 56, 55, 54, 54, 53, 52, 52, 36 | 51, 51, 50, 49, 49, 48, 48, 47, 37 | 47, 46, 46, 45, 44, 44, 43, 43, 38 | 42, 42, 41, 41, 40, 40, 39, 39, 39 | 39, 38, 38, 37, 37, 36, 36, 35, 40 | 35, 34, 34, 33, 33, 33, 32, 32, 41 | 31, 31, 30, 30, 30, 29, 29, 28, 42 | 28, 27, 27, 27, 27, 26, 25, 25, 43 | 25, 24, 24, 23, 23, 37, 27, 27, 44 | 25, 25, 25, 24, 24, 23, 23, 22, 45 | 22, 22, 21, 21, 20, 20, 20, 19, 46 | 19, 18, 18, 18, 17, 17, 16, 16, 47 | 16, 15, 15, 14, 14, 14, 13, 13, 48 | 12, 12, 12, 11, 11, 10, 10, 9, 49 | 9, 9, 8, 8, 7, 7, 7, 6, 50 | 6, 5, 5, 4, 4, 4, 3, 3, 51 | 2, 2, 1, 1, 0, 0, 0, 0, 52 | 0, 0, 0, 0 53 | ) 54 | 55 | def calculate_cpu_temp(retval): 56 | if not len(retval) == 7 \ 57 | or not retval[0] == START_BYTE \ 58 | or not retval[1] == '\x03' \ 59 | or not retval[2] == '\x08' \ 60 | or not retval[-1] == STOP_BYTE: 61 | raise MCUException('Malformed answer, got {}'.format(retval.encode('hex'))) 62 | else: 63 | return THERMAL_TABLE[ ord(retval[5]) ] 64 | 65 | COMMANDS = { 66 | 'DEVICE_READY' : ("\xfa\x03\x01\x00\x00\x00\xfb", empty_answer), 67 | 'DEVICE_POWEROFF' : ("\xfa\x03\x03\x01\x01\x14\xfb", empty_answer), 68 | 'THERMAL_STATUS' : ("\xfa\x03\x08\x00\x00\x00\xfb", calculate_cpu_temp), 69 | 'FAN_STOP' : ("\xfa\x02\x00\x00\x00\x00\xfb", empty_answer), 70 | 'FAN_HALF' : ("\xfa\x02\x00\x01\x00\x00\xfb", empty_answer), 71 | 'FAN_FULL' : ("\xfa\x02\x00\x02\x00\x00\xfb", empty_answer), 72 | 'POWER_LED_ON' : ("\xfa\x03\x06\x01\x00\x01\xfb", empty_answer), 73 | 'POWER_LED_OFF' : ("\xfa\x03\x06\x00\x00\x01\xfb", empty_answer), 74 | 'POWER_LED_FLASH' : ("\xfa\x03\x06\x02\x00\x01\xfb", empty_answer) 75 | } 76 | 77 | UART = '/dev/ttyS1' 78 | LOCK_TIMEOUT = datetime.timedelta(seconds = 30) 79 | RESPONSE_TIMEOUT = datetime.timedelta(seconds = 10) 80 | RETRIES = 5 81 | 82 | 83 | if __name__ == "__main__": 84 | parser = argparse.ArgumentParser() 85 | parser.add_argument('command', choices = COMMANDS.keys()) 86 | args = parser.parse_args(sys.argv[1:]) 87 | 88 | with serial.Serial(UART, 115200, 8, serial.PARITY_NONE, serial.STOPBITS_ONE, timeout = 1) as serial_port: 89 | serial_port.nonblocking() 90 | 91 | timestamp = datetime.datetime.now() 92 | while datetime.datetime.now() < timestamp + LOCK_TIMEOUT: 93 | try: 94 | fcntl.flock(serial_port.fileno(), fcntl.LOCK_EX | fcntl.LOCK_NB) 95 | except IOError: 96 | continue 97 | else: 98 | # Got the LOCK 99 | time.sleep(0.1) 100 | break 101 | else: 102 | warning('Serial port is busy. Waited {}.'.format(LOCK_TIMEOUT)) 103 | sys.exit(1) 104 | 105 | cmd_bytes, cmd_func = COMMANDS[args.command] 106 | for attempt in range(RETRIES): 107 | try: 108 | serial_port.write( cmd_bytes ) 109 | serial_port.flush() 110 | 111 | timestamp = datetime.datetime.now() 112 | buf = '' 113 | while datetime.datetime.now() < timestamp + RESPONSE_TIMEOUT: 114 | buf += serial_port.read() 115 | 116 | if len(buf) >= 7 and buf[-7:] == ACK: 117 | print(cmd_func(buf[:-7])) 118 | break 119 | else: 120 | raise MCUException('MCU did not respond with ACK. Waited {} and only got {}.'.format(RESPONSE_TIMEOUT, buf.encode('hex'))) 121 | except MCUException as e: 122 | warning(e) 123 | warning('I will try again...') 124 | time.sleep(0.1) 125 | continue 126 | else: 127 | break 128 | else: 129 | warning('Tried {} times. Aboring...'.format(RETRIES)) 130 | sys.exit(1) 131 | 132 | sys.exit(0) 133 | -------------------------------------------------------------------------------- /kernel/dts/kirkwood-dns320l.dts: -------------------------------------------------------------------------------- 1 | /dts-v1/; 2 | 3 | /* 4 | * Device Tree file for DLINK DNS-320L 5 | * 6 | * Copyright (C) 2015, Sunke Schlüters 7 | * 8 | * This program is free software; you can redistribute it and/or 9 | * modify it under the terms of the GNU General Public License 10 | * as published by the Free Software Foundation; either version 11 | * 2 of the License, or (at your option) any later version. 12 | * 13 | * 14 | * This file is based on the work of Andreas Böhler : 15 | * - http://www.aboehler.at/doku/doku.php/projects:dns320l 16 | * - http://www.aboehler.at/hg/linux-dns320l/file/ba7a60ad7687/linux-3.12/kirkwood-dns320l.dts 17 | */ 18 | 19 | #include "kirkwood.dtsi" 20 | #include "kirkwood-6281.dtsi" 21 | 22 | / { 23 | model = "D-Link DNS-320L"; 24 | compatible = "dlink,dns-320l", "marvell,kirkwood-88f6702", "marvell,kirkwood"; 25 | 26 | memory { 27 | device_type = "memory"; 28 | reg = <0x00000000 0x10000000>; 29 | }; 30 | 31 | chosen { 32 | bootargs = "console=ttyS0,115200n8 earlyprintk"; 33 | stdout-path = &uart0; 34 | }; 35 | 36 | gpio-keys { 37 | compatible = "gpio-keys"; 38 | #address-cells = <1>; 39 | #size-cells = <0>; 40 | pinctrl-0 = <&pmx_button_reset &pmx_button_usb_copy>; 41 | pinctrl-names = "default"; 42 | 43 | button@1 { 44 | label = "Reset push button"; 45 | linux,code = ; 46 | gpios = <&gpio0 28 1>; 47 | }; 48 | button@2 { 49 | label = "USB unmount button"; 50 | linux,code = ; 51 | gpios = <&gpio0 27 1>; 52 | }; 53 | }; 54 | 55 | gpio-leds { 56 | compatible = "gpio-leds"; 57 | pinctrl-0 = <&pmx_led_usb_blue &pmx_led_red_right_hdd 58 | &pmx_led_red_left_hdd &pmx_led_usb_orange>; 59 | pinctrl-names = "default"; 60 | 61 | blue-usb { 62 | label = "usb_blue"; 63 | gpios = <&gpio0 25 GPIO_ACTIVE_HIGH>; 64 | }; 65 | orange-usb { 66 | label = "usb_orange"; 67 | gpios = <&gpio0 26 GPIO_ACTIVE_HIGH>; 68 | }; 69 | orange-l_hdd { 70 | label = "hdd1_orange"; 71 | gpios = <&gpio0 23 GPIO_ACTIVE_HIGH>; 72 | }; 73 | orange-r_hdd { 74 | label = "hdd2_orange"; 75 | gpios = <&gpio0 22 GPIO_ACTIVE_HIGH>; 76 | }; 77 | }; 78 | 79 | ocp@f1000000 { 80 | pinctrl: pin-controller@10000 { 81 | 82 | pinctrl-0 = <&pmx_button_power>; 83 | pinctrl-names = "default"; 84 | 85 | pmx_sata0: pmx-sata0 { 86 | marvell,pins = "mpp20"; 87 | marvell,function = "sata0"; 88 | }; 89 | pmx_sata1: pmx-sata1 { 90 | marvell,pins = "mpp21"; 91 | marvell,function = "sata1"; 92 | }; 93 | pmx_led_red_right_hdd: pmx-led-red-right-hdd { 94 | marvell,pins = "mpp22"; 95 | marvell,function = "gpio"; 96 | }; 97 | pmx_led_red_left_hdd: pmx-led-red-left-hdd { 98 | marvell,pins = "mpp23"; 99 | marvell,function = "gpio"; 100 | }; 101 | pmx_power_sata: pmx-power-sata { 102 | marvell,pins = "mpp24"; 103 | marvell,function = "gpio"; 104 | }; 105 | pmx_led_usb_blue: pmx-led-usb-blue { 106 | marvell,pins = "mpp25"; 107 | marvell,function = "gpio"; 108 | }; 109 | pmx_led_usb_orange: pmx-led-usb-orange { 110 | marvell,pins = "mpp26"; 111 | marvell,function = "gpio"; 112 | }; 113 | pmx_button_usb_copy: pmx-button-usb-copy { 114 | marvell,pins = "mpp27"; 115 | marvell,function = "gpio"; 116 | }; 117 | pmx_button_reset: pmx-button-reset { 118 | marvell,pins = "mpp28"; 119 | marvell,function = "gpio"; 120 | }; 121 | pmx_button_power: pmx-button-power { // I can't get this one to trigger a button press... 122 | marvell,pins = "mpp29"; 123 | marvell,function = "gpio"; 124 | }; 125 | }; 126 | sata@80000 { 127 | status = "okay"; 128 | nr-ports = <2>; 129 | }; 130 | serial@12000 { 131 | status = "okay"; 132 | }; 133 | 134 | serial@12100 { 135 | pinctrl-0 = <&pmx_uart1>; 136 | pinctrl-names = "default"; 137 | status = "okay"; 138 | }; 139 | }; 140 | 141 | regulators { 142 | compatible = "simple-bus"; 143 | #address-cells = <1>; 144 | #size-cells = <0>; 145 | pinctrl-0 = <&pmx_power_sata>; 146 | pinctrl-names = "default"; 147 | 148 | sata_power: regulator@1 { 149 | compatible = "regulator-fixed"; 150 | reg = <1>; 151 | regulator-name = "SATA Power"; 152 | regulator-min-microvolt = <5000000>; 153 | regulator-max-microvolt = <5000000>; 154 | enable-active-high; 155 | regulator-always-on; 156 | regulator-boot-on; 157 | gpio = <&gpio1 24 0>; 158 | }; 159 | }; 160 | }; 161 | 162 | &nand { 163 | pinctrl-0 = <&pmx_nand>; 164 | pinctrl-names = "default"; 165 | status = "okay"; 166 | chip-delay = <35>; 167 | 168 | partition@0 { 169 | label = "u-boot"; 170 | reg = <0x0000000 0x100000>; 171 | read-only; 172 | }; 173 | 174 | partition@100000 { 175 | label = "uImage"; 176 | reg = <0x0100000 0x500000>; 177 | }; 178 | 179 | partition@600000 { 180 | label = "ramdisk"; 181 | reg = <0x0600000 0x500000>; 182 | }; 183 | 184 | partition@b00000 { 185 | label = "image"; 186 | reg = <0x0b00000 0x6400000>; 187 | }; 188 | 189 | partition@6f00000 { 190 | label = "mini firmware"; 191 | reg = <0x6f00000 0xa00000>; 192 | }; 193 | 194 | partition@7900000 { 195 | label = "config"; 196 | reg = <0x7900000 0x500000>; 197 | }; 198 | 199 | partition@7e00000 { 200 | label = "my-dlink"; 201 | reg = <0x7e00000 0x200000>; 202 | }; 203 | }; 204 | 205 | &mdio { 206 | status = "okay"; 207 | 208 | ethphy0: ethernet-phy@0 { 209 | reg = <0>; 210 | }; 211 | }; 212 | 213 | ð0 { 214 | status = "okay"; 215 | ethernet0-port@0 { 216 | phy-handle = <ðphy0>; 217 | }; 218 | }; 219 | -------------------------------------------------------------------------------- /kernel/config.d/30-filesystem: -------------------------------------------------------------------------------- 1 | 2 | # 3 | # File systems 4 | # 5 | # CONFIG_EXT2_FS is not set 6 | # CONFIG_EXT3_FS is not set 7 | CONFIG_EXT4_FS=y 8 | CONFIG_EXT4_USE_FOR_EXT23=y 9 | CONFIG_EXT4_FS_POSIX_ACL=y 10 | CONFIG_EXT4_FS_SECURITY=y 11 | # CONFIG_EXT4_DEBUG is not set 12 | CONFIG_JBD2=m 13 | # CONFIG_JBD2_DEBUG is not set 14 | CONFIG_FS_MBCACHE=m 15 | CONFIG_REISERFS_FS=m 16 | # CONFIG_REISERFS_CHECK is not set 17 | # CONFIG_REISERFS_PROC_INFO is not set 18 | CONFIG_REISERFS_FS_XATTR=y 19 | CONFIG_REISERFS_FS_POSIX_ACL=y 20 | CONFIG_REISERFS_FS_SECURITY=y 21 | CONFIG_JFS_FS=m 22 | CONFIG_JFS_POSIX_ACL=y 23 | CONFIG_JFS_SECURITY=y 24 | # CONFIG_JFS_DEBUG is not set 25 | # CONFIG_JFS_STATISTICS is not set 26 | CONFIG_XFS_FS=m 27 | CONFIG_XFS_QUOTA=y 28 | CONFIG_XFS_POSIX_ACL=y 29 | CONFIG_XFS_RT=y 30 | # CONFIG_XFS_WARN is not set 31 | # CONFIG_XFS_DEBUG is not set 32 | CONFIG_GFS2_FS=m 33 | CONFIG_GFS2_FS_LOCKING_DLM=y 34 | CONFIG_OCFS2_FS=m 35 | CONFIG_OCFS2_FS_O2CB=m 36 | CONFIG_OCFS2_FS_USERSPACE_CLUSTER=m 37 | CONFIG_OCFS2_FS_STATS=y 38 | CONFIG_OCFS2_DEBUG_MASKLOG=y 39 | # CONFIG_OCFS2_DEBUG_FS is not set 40 | CONFIG_BTRFS_FS=m 41 | CONFIG_BTRFS_FS_POSIX_ACL=y 42 | # CONFIG_BTRFS_FS_CHECK_INTEGRITY is not set 43 | # CONFIG_BTRFS_FS_RUN_SANITY_TESTS is not set 44 | # CONFIG_BTRFS_DEBUG is not set 45 | # CONFIG_BTRFS_ASSERT is not set 46 | CONFIG_NILFS2_FS=m 47 | CONFIG_FS_POSIX_ACL=y 48 | CONFIG_EXPORTFS=y 49 | CONFIG_FILE_LOCKING=y 50 | CONFIG_FSNOTIFY=y 51 | CONFIG_DNOTIFY=y 52 | CONFIG_INOTIFY_USER=y 53 | CONFIG_FANOTIFY=y 54 | # CONFIG_FANOTIFY_ACCESS_PERMISSIONS is not set 55 | CONFIG_QUOTA=y 56 | CONFIG_QUOTA_NETLINK_INTERFACE=y 57 | CONFIG_PRINT_QUOTA_WARNING=y 58 | # CONFIG_QUOTA_DEBUG is not set 59 | CONFIG_QUOTA_TREE=m 60 | CONFIG_QFMT_V1=m 61 | CONFIG_QFMT_V2=m 62 | CONFIG_QUOTACTL=y 63 | CONFIG_AUTOFS4_FS=m 64 | CONFIG_FUSE_FS=m 65 | CONFIG_CUSE=m 66 | 67 | # 68 | # CD-ROM/DVD Filesystems 69 | # 70 | CONFIG_ISO9660_FS=m 71 | CONFIG_JOLIET=y 72 | CONFIG_ZISOFS=y 73 | CONFIG_UDF_FS=m 74 | CONFIG_UDF_NLS=y 75 | 76 | # 77 | # DOS/FAT/NT Filesystems 78 | # 79 | CONFIG_FAT_FS=m 80 | CONFIG_MSDOS_FS=m 81 | CONFIG_VFAT_FS=m 82 | CONFIG_FAT_DEFAULT_CODEPAGE=437 83 | CONFIG_FAT_DEFAULT_IOCHARSET="utf8" 84 | CONFIG_NTFS_FS=m 85 | # CONFIG_NTFS_DEBUG is not set 86 | CONFIG_NTFS_RW=y 87 | 88 | # 89 | # Pseudo filesystems 90 | # 91 | CONFIG_PROC_FS=y 92 | CONFIG_PROC_SYSCTL=y 93 | CONFIG_PROC_PAGE_MONITOR=y 94 | CONFIG_KERNFS=y 95 | CONFIG_SYSFS=y 96 | CONFIG_TMPFS=y 97 | CONFIG_TMPFS_POSIX_ACL=y 98 | CONFIG_TMPFS_XATTR=y 99 | # CONFIG_HUGETLB_PAGE is not set 100 | CONFIG_CONFIGFS_FS=m 101 | CONFIG_MISC_FILESYSTEMS=y 102 | CONFIG_ADFS_FS=m 103 | # CONFIG_ADFS_FS_RW is not set 104 | CONFIG_AFFS_FS=m 105 | CONFIG_ECRYPT_FS=m 106 | CONFIG_ECRYPT_FS_MESSAGING=y 107 | CONFIG_HFS_FS=m 108 | CONFIG_HFSPLUS_FS=m 109 | # CONFIG_HFSPLUS_FS_POSIX_ACL is not set 110 | CONFIG_BEFS_FS=m 111 | # CONFIG_BEFS_DEBUG is not set 112 | CONFIG_BFS_FS=m 113 | CONFIG_EFS_FS=m 114 | CONFIG_JFFS2_FS=y 115 | CONFIG_JFFS2_FS_DEBUG=0 116 | CONFIG_JFFS2_FS_WRITEBUFFER=y 117 | # CONFIG_JFFS2_FS_WBUF_VERIFY is not set 118 | CONFIG_JFFS2_SUMMARY=y 119 | CONFIG_JFFS2_FS_XATTR=y 120 | CONFIG_JFFS2_FS_POSIX_ACL=y 121 | CONFIG_JFFS2_FS_SECURITY=y 122 | CONFIG_JFFS2_COMPRESSION_OPTIONS=y 123 | CONFIG_JFFS2_ZLIB=y 124 | CONFIG_JFFS2_LZO=y 125 | CONFIG_JFFS2_RTIME=y 126 | # CONFIG_JFFS2_RUBIN is not set 127 | # CONFIG_JFFS2_CMODE_NONE is not set 128 | CONFIG_JFFS2_CMODE_PRIORITY=y 129 | # CONFIG_JFFS2_CMODE_SIZE is not set 130 | # CONFIG_JFFS2_CMODE_FAVOURLZO is not set 131 | CONFIG_UBIFS_FS=y 132 | CONFIG_UBIFS_FS_ADVANCED_COMPR=y 133 | CONFIG_UBIFS_FS_LZO=y 134 | CONFIG_UBIFS_FS_ZLIB=y 135 | CONFIG_LOGFS=m 136 | CONFIG_CRAMFS=m 137 | CONFIG_SQUASHFS=m 138 | CONFIG_SQUASHFS_FILE_CACHE=y 139 | # CONFIG_SQUASHFS_FILE_DIRECT is not set 140 | CONFIG_SQUASHFS_DECOMP_SINGLE=y 141 | # CONFIG_SQUASHFS_DECOMP_MULTI is not set 142 | # CONFIG_SQUASHFS_DECOMP_MULTI_PERCPU is not set 143 | CONFIG_SQUASHFS_XATTR=y 144 | CONFIG_SQUASHFS_ZLIB=y 145 | CONFIG_SQUASHFS_LZO=y 146 | CONFIG_SQUASHFS_XZ=y 147 | # CONFIG_SQUASHFS_4K_DEVBLK_SIZE is not set 148 | # CONFIG_SQUASHFS_EMBEDDED is not set 149 | CONFIG_SQUASHFS_FRAGMENT_CACHE_SIZE=3 150 | CONFIG_VXFS_FS=m 151 | CONFIG_MINIX_FS=m 152 | CONFIG_OMFS_FS=m 153 | # CONFIG_HPFS_FS is not set 154 | CONFIG_QNX4FS_FS=m 155 | CONFIG_QNX6FS_FS=m 156 | # CONFIG_QNX6FS_DEBUG is not set 157 | CONFIG_ROMFS_FS=m 158 | # CONFIG_ROMFS_BACKED_BY_BLOCK is not set 159 | # CONFIG_ROMFS_BACKED_BY_MTD is not set 160 | CONFIG_ROMFS_BACKED_BY_BOTH=y 161 | CONFIG_ROMFS_ON_BLOCK=y 162 | CONFIG_ROMFS_ON_MTD=y 163 | # CONFIG_PSTORE is not set 164 | CONFIG_SYSV_FS=m 165 | CONFIG_UFS_FS=m 166 | # CONFIG_UFS_FS_WRITE is not set 167 | # CONFIG_UFS_DEBUG is not set 168 | CONFIG_EXOFS_FS=m 169 | # CONFIG_EXOFS_DEBUG is not set 170 | CONFIG_F2FS_FS=m 171 | CONFIG_F2FS_STAT_FS=y 172 | CONFIG_F2FS_FS_XATTR=y 173 | CONFIG_F2FS_FS_POSIX_ACL=y 174 | CONFIG_F2FS_FS_SECURITY=y 175 | # CONFIG_F2FS_CHECK_FS is not set 176 | CONFIG_AUFS_FS=m 177 | CONFIG_AUFS_BRANCH_MAX_127=y 178 | # CONFIG_AUFS_BRANCH_MAX_511 is not set 179 | # CONFIG_AUFS_BRANCH_MAX_1023 is not set 180 | # CONFIG_AUFS_BRANCH_MAX_32767 is not set 181 | CONFIG_AUFS_SBILIST=y 182 | # CONFIG_AUFS_HNOTIFY is not set 183 | CONFIG_AUFS_EXPORT=y 184 | # CONFIG_AUFS_FHSM is not set 185 | # CONFIG_AUFS_RDU is not set 186 | # CONFIG_AUFS_SHWH is not set 187 | # CONFIG_AUFS_BR_RAMFS is not set 188 | # CONFIG_AUFS_BR_FUSE is not set 189 | CONFIG_AUFS_BR_HFSPLUS=y 190 | CONFIG_AUFS_BDEV_LOOP=y 191 | # CONFIG_AUFS_DEBUG is not set 192 | CONFIG_ORE=m 193 | CONFIG_NETWORK_FILESYSTEMS=y 194 | CONFIG_NFS_FS=m 195 | CONFIG_NFS_V2=m 196 | CONFIG_NFS_V3=m 197 | CONFIG_NFS_V3_ACL=y 198 | CONFIG_NFS_V4=m 199 | CONFIG_NFS_SWAP=y 200 | CONFIG_NFS_V4_1=y 201 | CONFIG_NFS_V4_2=y 202 | CONFIG_PNFS_FILE_LAYOUT=m 203 | CONFIG_PNFS_BLOCK=m 204 | CONFIG_PNFS_OBJLAYOUT=m 205 | CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN="kernel.org" 206 | # CONFIG_NFS_V4_1_MIGRATION is not set 207 | CONFIG_NFS_V4_SECURITY_LABEL=y 208 | CONFIG_NFS_FSCACHE=y 209 | # CONFIG_NFS_USE_LEGACY_DNS is not set 210 | CONFIG_NFS_USE_KERNEL_DNS=y 211 | CONFIG_NFS_DEBUG=y 212 | CONFIG_NFSD=m 213 | CONFIG_NFSD_V2_ACL=y 214 | CONFIG_NFSD_V3=y 215 | CONFIG_NFSD_V3_ACL=y 216 | CONFIG_NFSD_V4=y 217 | # CONFIG_NFSD_V4_SECURITY_LABEL is not set 218 | # CONFIG_NFSD_FAULT_INJECTION is not set 219 | CONFIG_LOCKD=m 220 | CONFIG_LOCKD_V4=y 221 | CONFIG_NFS_ACL_SUPPORT=m 222 | CONFIG_NFS_COMMON=y 223 | CONFIG_SUNRPC=m 224 | CONFIG_SUNRPC_GSS=m 225 | CONFIG_SUNRPC_BACKCHANNEL=y 226 | CONFIG_SUNRPC_SWAP=y 227 | CONFIG_RPCSEC_GSS_KRB5=m 228 | CONFIG_SUNRPC_DEBUG=y 229 | CONFIG_SUNRPC_XPRT_RDMA_CLIENT=m 230 | CONFIG_SUNRPC_XPRT_RDMA_SERVER=m 231 | CONFIG_CEPH_FS=m 232 | CONFIG_CEPH_FSCACHE=y 233 | CONFIG_CEPH_FS_POSIX_ACL=y 234 | CONFIG_CIFS=m 235 | # CONFIG_CIFS_STATS is not set 236 | CONFIG_CIFS_WEAK_PW_HASH=y 237 | CONFIG_CIFS_UPCALL=y 238 | CONFIG_CIFS_XATTR=y 239 | CONFIG_CIFS_POSIX=y 240 | CONFIG_CIFS_ACL=y 241 | CONFIG_CIFS_DEBUG=y 242 | # CONFIG_CIFS_DEBUG2 is not set 243 | CONFIG_CIFS_DFS_UPCALL=y 244 | CONFIG_CIFS_SMB2=y 245 | CONFIG_CIFS_FSCACHE=y 246 | CONFIG_NCP_FS=m 247 | CONFIG_NCPFS_PACKET_SIGNING=y 248 | CONFIG_NCPFS_IOCTL_LOCKING=y 249 | CONFIG_NCPFS_STRONG=y 250 | CONFIG_NCPFS_NFS_NS=y 251 | CONFIG_NCPFS_OS2_NS=y 252 | # CONFIG_NCPFS_SMALLDOS is not set 253 | CONFIG_NCPFS_NLS=y 254 | CONFIG_NCPFS_EXTRAS=y 255 | CONFIG_CODA_FS=m 256 | CONFIG_AFS_FS=m 257 | # CONFIG_AFS_DEBUG is not set 258 | CONFIG_AFS_FSCACHE=y 259 | CONFIG_9P_FS=m 260 | CONFIG_9P_FSCACHE=y 261 | CONFIG_9P_FS_POSIX_ACL=y 262 | CONFIG_9P_FS_SECURITY=y 263 | CONFIG_NLS=y 264 | CONFIG_NLS_DEFAULT="utf8" 265 | CONFIG_NLS_CODEPAGE_437=m 266 | CONFIG_NLS_CODEPAGE_737=m 267 | CONFIG_NLS_CODEPAGE_775=m 268 | CONFIG_NLS_CODEPAGE_850=m 269 | CONFIG_NLS_CODEPAGE_852=m 270 | CONFIG_NLS_CODEPAGE_855=m 271 | CONFIG_NLS_CODEPAGE_857=m 272 | CONFIG_NLS_CODEPAGE_860=m 273 | CONFIG_NLS_CODEPAGE_861=m 274 | CONFIG_NLS_CODEPAGE_862=m 275 | CONFIG_NLS_CODEPAGE_863=m 276 | CONFIG_NLS_CODEPAGE_864=m 277 | CONFIG_NLS_CODEPAGE_865=m 278 | CONFIG_NLS_CODEPAGE_866=m 279 | CONFIG_NLS_CODEPAGE_869=m 280 | CONFIG_NLS_CODEPAGE_936=m 281 | CONFIG_NLS_CODEPAGE_950=m 282 | CONFIG_NLS_CODEPAGE_932=m 283 | CONFIG_NLS_CODEPAGE_949=m 284 | CONFIG_NLS_CODEPAGE_874=m 285 | CONFIG_NLS_ISO8859_8=m 286 | CONFIG_NLS_CODEPAGE_1250=m 287 | CONFIG_NLS_CODEPAGE_1251=m 288 | CONFIG_NLS_ASCII=m 289 | CONFIG_NLS_ISO8859_1=m 290 | CONFIG_NLS_ISO8859_2=m 291 | CONFIG_NLS_ISO8859_3=m 292 | CONFIG_NLS_ISO8859_4=m 293 | CONFIG_NLS_ISO8859_5=m 294 | CONFIG_NLS_ISO8859_6=m 295 | CONFIG_NLS_ISO8859_7=m 296 | CONFIG_NLS_ISO8859_9=m 297 | CONFIG_NLS_ISO8859_13=m 298 | CONFIG_NLS_ISO8859_14=m 299 | CONFIG_NLS_ISO8859_15=m 300 | CONFIG_NLS_KOI8_R=m 301 | CONFIG_NLS_KOI8_U=m 302 | CONFIG_NLS_MAC_ROMAN=m 303 | CONFIG_NLS_MAC_CELTIC=m 304 | CONFIG_NLS_MAC_CENTEURO=m 305 | CONFIG_NLS_MAC_CROATIAN=m 306 | CONFIG_NLS_MAC_CYRILLIC=m 307 | CONFIG_NLS_MAC_GAELIC=m 308 | CONFIG_NLS_MAC_GREEK=m 309 | CONFIG_NLS_MAC_ICELAND=m 310 | CONFIG_NLS_MAC_INUIT=m 311 | CONFIG_NLS_MAC_ROMANIAN=m 312 | CONFIG_NLS_MAC_TURKISH=m 313 | CONFIG_NLS_UTF8=m 314 | CONFIG_DLM=m 315 | CONFIG_DLM_DEBUG=y 316 | --------------------------------------------------------------------------------