Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
Next revisionBoth sides next revision
toh:etisalat:s3 [2023/01/11 19:01] – Created from the form at meta:create_new_device_page csharper2005toh:etisalat:s3 [2023/10/16 20:12] – [Installation] csharper2005
Line 5: Line 5:
 /* USE https://openwrt.org/meta/create_new_device_page */ /* USE https://openwrt.org/meta/create_new_device_page */
  
-{{page>meta:infobox:construction&noheader&nofooter&noeditbtn}} 
  
-//Write a short, relevant description of the device. Include a technical overview, but avoid marketing buzzwords/useless stuff. Two to four sentences is about right. A picture is good, too. Edit the page to see how to add pictures.//+OEM: Sercomm S3
  
-<WRAP BOX> +Etisalat S3 is wireless router based on the MT7621 platform with USB 3.0 port.
-FIXME Any text with light background (like this one) provides instructions for creating the Details PageWhen you have filled in correct/useful information (instead of any template that's there) **remove the instructions, as well as the ''<nowiki><WRAP></nowiki>'' that encloses it.** +
-</WRAP>+
  
-/*****/ +{{media:sercomm:sercomm_s3_front.jpg?400|Etisalat S3}}
-/* How to add images ========> http://openwrt.org/meta/adding_images_to_openwrt_wiki */ +
-/*****/+
  
-{{media:example:genericrouter1.png?200|Generic Router}} 
- 
-<WRAP BOX> 
-FIXME 
-===== Getting started with a new Device Page ===== 
-  - This is an empty template that suggests the information that should be present on a well-constructed Device Page. This means, that **you have to fill it with life and information.** 
-  - There are several "fixme" tags with text on a light background (like this text) throughout this template. As you fill in the page, remove those tags so that people can judge its completeness. 
-  - When there are no more "fixme" tags left, delete this one too, along with the ''<nowiki><WRAP></nowiki>'' that encloses it. 
- 
-===== Keep the articles modular ===== 
-  * Please include only model specific information, omit bla,bla and put everything generic into separate articles 
-  * If you have no time to write certain stuff, link to [[docs:start]] 
-  * [[docs:guide-user:base-system:start]] should lead the way, do not explain this again 
-  * DO NOT provide a complete howto here! Instead //groom// the [[docs:start|general documentation]]. 
-</WRAP> 
  
 ===== Supported Versions ===== ===== Supported Versions =====
- 
-<WRAP BOX> 
-FIXME 
-  - The tables below are automatically generated, **once the correct filters for Brand and Model are set.** 
-  - If the tables below show information for ''<nowiki>Etisalat S3 </nowiki>'', everything is OK and you can delete this text and the ''<nowiki><WRAP></nowiki>'' that encloses it. 
-  - If the tables below contain "Nothing found", it means that either 
-    - the dataentry page for Etisalat S3  is missing. Please [[meta:create_new_dataentry_page|create a new dataentry page]] first, then reload this page. The tables should then contain $something. If they do, delete this text and the ''<nowiki><WRAP></nowiki>'' that encloses it. 
-    - filters are not set correctly. Most common reason for "Nothing found": The dataentry does not contain a Version, but we are filtering here for version -> Please **edit this section and adjust the filters with the proper Brand, Model and Version.** In case the dataentry does not contain a version, delete the line ''filter  : Versions~''. Just try, it's easy. The tables should then contain $something. If they do, delete this text and the ''<nowiki><WRAP></nowiki>'' that encloses it. 
-  - If the tables still contain "Nothing found": Don't panic, calm down, take a deep breath and [[:contact|contact a wiki admin]] (tmomas) for help. 
-</WRAP> 
  
 ---- datatable ---- ---- datatable ----
Line 51: Line 21:
 filter  : Brand=Etisalat filter  : Brand=Etisalat
 filter  : Model=S3 filter  : Model=S3
-filter  : Versions~ 
----- 
- 
-/* If no unsupported functions known, comment out the following datatable or delete it. */ 
----- datatable ---- 
-cols    : Unsupported Functions_unsupporteds 
-filter  : Brand=Etisalat 
-filter  : Model=S3 
-filter  : Versions~ 
 ---- ----
  
 ===== Experimental Versions ===== ===== Experimental Versions =====
  
-/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *  +  * [[https://forum.openwrt.org/t/add-support-for-beeline-smartbox-giga/99390/4|Community builds]]
-   The official Table of Hardware only lists current, stable versions of OpenWrt.  * +
-   Use this space to describe any on-going efforts to create a newer version       * +
-   of the firmware for this device. Provide links to firmware images,              * +
-   active threads on the forum, or other sources of information                  * +
- * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +
- +
-//None at this time.//+
  
 ===== Hardware Highlights ===== ===== Hardware Highlights =====
Line 80: Line 34:
 filter  : Brand=Etisalat filter  : Brand=Etisalat
 filter  : Model=S3 filter  : Model=S3
-filter  : Versions~ 
 ---- ----
  
Line 86: Line 39:
 ===== Installation ===== ===== Installation =====
 /* stable release */ /* stable release */
-/* uncomment once stable release is available+
 ---- datatable ---- ---- datatable ----
 cols    : Model, Versions, Supported Current Rel, Firmware OpenWrt Install URL_url, Firmware OpenWrt Upgrade URL_url, Firmware OEM Stock URL_url cols    : Model, Versions, Supported Current Rel, Firmware OpenWrt Install URL_url, Firmware OpenWrt Upgrade URL_url, Firmware OEM Stock URL_url
Line 93: Line 46:
 filter  : Brand=Etisalat filter  : Brand=Etisalat
 filter  : Model=S3 filter  : Model=S3
-filter  : Versions~ 
 ---- ----
-*/ 
  
 +==== OpenWrt installation ====
 +
 +1.  Login to the router web interface under admin account
 +
 +2.  Navigate to Settings -> Configuration -> Save to Computer
 +
 +3.  Decode the configuration. For example, using cfgtool.py tool (A tool for decoding and encoding Sercomm configs - https://github.com/r3d5ky/sercomm_cfg_unpacker):
 +<code bash>
 +cfgtool.py -u configurationBackup.cfg
 +</code>
 +
 +<hidden cfgtool.py>
 +<code bash>
 +"""
 +Copyright (c) 2022 r3d5ky
 +
 +Permission is hereby granted, free of charge, to any person obtaining a copy
 +of this software and associated documentation files (the "Software"), to deal
 +in the Software without restriction, including without limitation the rights
 +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 +copies of the Software, and to permit persons to whom the Software is
 +furnished to do so, subject to the following conditions:
 +
 +The above copyright notice and this permission notice shall be included in all
 +copies or substantial portions of the Software.
 +
 +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
 +DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
 +OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE
 +OR OTHER DEALINGS IN THE SOFTWARE.
 +"""
 +
 +import zlib
 +import sys
 +import argparse
 +
 +def unpack(cfg_file, raw):
 +    with open(cfg_file, 'rb') as f:
 +        infile = f.read()
 +
 +    unpacked = zlib.decompress(infile[4:])
 +    config = unpacked[unpacked.find(b'\x3c\x44\x41\x54\x41'):-6]
 +    userdata = unpacked[:unpacked.find(b'\x3c\x44\x41\x54\x41')]
 +    
 +    if raw:
 +        with open(cfg_file[:-4] + '_raw.txt', 'wb') as f:
 +            f.write(unpacked)
 +
 +    with open(cfg_file[:-4] + '.xml', 'wb') as f:
 +        f.write(config)
 +    with open(cfg_file[:-4] + '_userdata.bin', 'wb') as f:
 +        f.write(userdata)
 +
 +
 +def pack(xml_file, endianness):
 +    with open(xml_file, 'rb') as f:
 +        rawconfig = f.read() + b'\x0a\x00'
 +    with open(xml_file[:-4] + '_userdata.bin', 'rb') as f:
 +        userdata = f.read()
 +    endian = "little"
 +    if endianness:
 +        endian = "big"
 +    crc = zlib.crc32(rawconfig).to_bytes(4, endian)
 +    config = userdata + rawconfig + crc
 +    
 +    with open(sys.argv[2][:-4] + '_changed.cfg', 'wb') as f: 
 +        f.write(len(config).to_bytes(4, endian) + zlib.compress(config))
  
-/* snapshot */ 
-/* delete once stable release is available */ 
----- datatable ---- 
-cols    : Model, Versions, Supported Current Rel, Firmware OpenWrt snapshot Install URL_url, Firmware OpenWrt snapshot Upgrade URL_url, Firmware OEM Stock URL_url 
-headers : Model, Version, Current Release, Firmware OpenWrt snapshot Install, Firmware OpenWrt snapshot Upgrade, Firmware OEM Stock 
-align   : c,c,c 
-filter  : Brand=Etisalat 
-filter  : Model=S3 
-filter  : Versions~ 
----- 
  
 +def main():
 +    parser = argparse.ArgumentParser(description="Sercomm backup config packer/unpacker")
 +    group = parser.add_mutually_exclusive_group(required=True)
 +    group.add_argument("-u","--unpack", action='store_true', help="unpack .cfg file to .xml + header")
 +    group.add_argument("-p","--pack", action='store_true', help="pack .xml + header back to .cfg")
 +    parser.add_argument("-r","--raw", action='store_true', help="create additional file with raw unpacked data (optional)")
 +    parser.add_argument("-b","--big", action='store_true', help="pack for Big Endian arch (default is Little Endian)")
 +    parser.add_argument('file', type=str, help="path to .cfg/.xml file for unpacking/packing")
 +    args = parser.parse_args()
 +    
 +    if args.unpack:
 +        unpack(args.file, args.raw)
 +    elif args.pack:
 +        pack(args.file, args.big)
  
--> [[docs:guide-user:installation:generic.flashing|Install OpenWrt (generic explanation)]]+    print("Done!")
  
-FIXME Please add the installation procedure here. 
  
 +if __name__ == '__main__':
 +    main()
 +</code>
 +</hidden>
 +
 +
 +4.  Open configurationBackup.xml and find the following line:
 +<code bash>
 +<PARAMETER name="Password" type="string" value="<your router serial is here>" writable="1" encryption="1" password="1"/>
 +</code>
 +       
 +5.  Insert the following line after and save:
 +<code bash>
 +<PARAMETER name="Enable" type="boolean" value="1" writable="1" encryption="0"/>
 +</code>
 +
 +6.  Encode the configuration. For example, using cfgtool.py tool:
 +<code bash>
 +cfgtool.py -p configurationBackup.xml
 +</code>
 +
 +7.  Upload the changed configuration (configurationBackup_changed.cfg) to the router
 +
 +8.  Login to the router web interface (SuperUser:ETxxxxxxxxxx, where ETxxxxxxxxxx is the serial number from the backplate label)
 +
 +9.  Navigate to Settings -> Access Control -> Allow SSH (& Press apply)
 +
 +10. Connect to the router using SSH shell under SuperUser account
 +
 +11. Run in SSH shell:
 +<code bash>
 +sh
 +</code>
 +
 +12. Make a mtd backup (optional, see related section)
 +
 +13. Change bootflag to Sercomm1 and reboot:
 +<code bash>
 +printf 1 | dd bs=1 seek=7 count=1 of=/dev/mtdblock3
 +reboot
 +</code>
 +
 +14. Login to the router web interface under admin account
 +
 +15. Remove dots from the OpenWrt factory image filename
 +
 +16. Update firmware via web using OpenWrt factory image
 +
 +==== Backup ====
 +
 +It's recommended to make a mtd backup before you start:
 +
 +1. Set up a tftp server (e.g. tftpd64 for windows)
 +
 +2. Connect to a router using SSH shell and run the following commands:
 +<code bash>
 +cd /tmp
 +for i in 0 1 2 3 4 5 6 7 8 9 10; do nanddump -f mtd$i /dev/mtd$i; \
 +tftp -l mtd$i -p 10.0.0.2; md5sum mtd$i >> mtd.md5; rm mtd$i; done
 +tftp -l mtd.md5 -p 10.0.0.2
 +</code>
 +
 +==== Return to Stock ====
 +1. Change the bootflag to Sercomm1 in OpenWrt CLI and then reboot:
 +<code bash>
 +printf 1 | dd bs=1 seek=7 count=1 of=/dev/mtdblock3
 +</code>
 +2. Optional: Update with any stock (Etisalat S3) firmware if you want to overwrite OpenWrt in Slot 0 completely.
 ==== Flash Layout ==== ==== Flash Layout ====
 <WRAP BOX> <WRAP BOX>
Line 123: Line 215:
 ==== OEM easy installation ==== ==== OEM easy installation ====
  
-<WRAP BOX> +See Installation section
-FIXME //The instructions below are for Broadcom devices and only serve as an example.//\\ +
-**//Remove / modify them if they do not apply to this particular device!//**+
  
-This section deals with +==== OEM installation using the TFTP method ====
-  * How you install OpenWrt from a device freshly opened +
-  * The steps required such as reset to factory defaults if the device has already been configured+
  
-**Note:** Reset router to factory defaults if it has been previously configured. +Not applicable
-  * Browse to ''<nowiki>http://192.168.1.1/Upgrade.asp</nowiki>'' +
-  * Upload .bin file to router +
-  * Wait for it to reboot +
-  * Telnet to 192.168.1.1 and set a root password, or browse to ''<nowiki>http://192.168.1.1</nowiki>'' if LuCI is installed. +
-</WRAP> +
- +
-==== OEM installation using the TFTP method ====+
  
 ->  [[docs:guide-user:installation:generic.flashing.tftp]] ->  [[docs:guide-user:installation:generic.flashing.tftp]]
- 
-=== Specific values needed for tftp === 
- 
-<WRAP BOX> 
- 
-FIXME Enter values for "FILL-IN" below 
- 
-^ Bootloader tftp server IPv4 address  | FILL-IN   | 
-^ Bootloader MAC address (special)     | FILL-IN   | 
-^ Firmware tftp image                  | [[:downloads|Latest OpenWrt release]] (**''NOTE:''** Name must contain //"tftp"//) | 
-^ TFTP transfer window                 | FILL-IN seconds                                | 
-^ TFTP window start                    | approximately FILL-IN seconds after power on   | 
-^ TFTP client required IP address      | FILL-IN                                        | 
- 
-</WRAP> 
  
 ===== Upgrading OpenWrt ===== ===== Upgrading OpenWrt =====
 ->  [[docs:guide-user:installation:generic.sysupgrade]] ->  [[docs:guide-user:installation:generic.sysupgrade]]
- 
-<WRAP BOX> 
- 
-FIXME These are generic instructions. Update with your router's specifics. 
  
 ==== LuCI Web Upgrade Process ==== ==== LuCI Web Upgrade Process ====
Line 173: Line 235:
  
 If you don't have a GUI (LuCI) available, you can alternatively upgrade via the command line. If you don't have a GUI (LuCI) available, you can alternatively upgrade via the command line.
-There are two command line methods for upgrading:+There is a command line method for upgrading:
  
   * ''sysupgrade''   * ''sysupgrade''
-  * ''mtd''+
  
 Note: It is important that you put the firmware image into the ramdisk (/tmp) before you start flashing. Note: It is important that you put the firmware image into the ramdisk (/tmp) before you start flashing.
Line 182: Line 244:
 === sysupgrade === === sysupgrade ===
  
-  * Login as root via SSH on 192.168.1.1, then enter the following commands:+  * Login as root via SSH on 192.168.1.1, copy images to /tmp using SCP and then enter the following commands:
  
-<code>+<code bash>
 cd /tmp cd /tmp
-wget http://downloads.openwrt.org/snapshots/trunk/XXX/xxx.abc +sysupgrade /tmp/sysupgrade.bin
-sysupgrade /tmp/xxx.abc+
 </code> </code>
  
-=== mtd ===+===== Debricking ===== 
 +-> [[docs:guide-user:troubleshooting:generic.debrick]]
  
-If ''sysupgrade'' does not support this router, use ''mtd''.+==== sercomm-recovery utility ==== 
 +1Compile [[https://github.com/danitool/sercomm-recovery|sercomm-recovery]] under the Linux: 
 +<code bash> 
 +git clone https://github.com/danitool/sercomm-recovery.git 
 +make 
 +</code>
  
-  * Login as root via SSH on 192.168.1.1, then enter the following commands: +2Connect the router with a cable and run sercomm-recovery
- +<code bash
-<code> +sudo ./sercomm-recovery enp0s3 recovery_etisalat_s3_stock_slot1.bin
-cd /tmp +
-wget http://downloads.openwrt.org/snapshots/trunk/XXX/xxx.abc +
-mtd write /tmp/xxx.abc linux && reboot+
 </code> </code>
 +where //enp0s3// - network interface connected the router, //ifconfig// - list on available network interfaces
  
-</WRAP> +3. Wait until the router is flashed and rebooted.
- +
-===== Debricking ===== +
--> [[docs:guide-user:troubleshooting:generic.debrick]]+
  
 +[[https://mega.nz/folder/tlIm1JLK#bBRJXq-DVkzJBOR2dC1K5w|Download ready recovery images]] for Sercomm devices.
 ===== Failsafe mode ===== ===== Failsafe mode =====
 -> [[docs:guide-user:troubleshooting:failsafe_and_factory_reset]] -> [[docs:guide-user:troubleshooting:failsafe_and_factory_reset]]
Line 216: Line 279:
 ===== Specific Configuration ===== ===== Specific Configuration =====
  
-<WRAP BOX> 
-FIXME Please fill in real values for this device, then remove the EXAMPLEs 
- 
-==== Network interfaces ==== 
 The default network configuration is: The default network configuration is:
-^ Interface Name   ^ Description                  ^ Default configuration    +^ Interface Name   ^ Description         ^ Default configuration   
-| br-lan           EXAMPLE LAN & WiFi           EXAMPLE 192.168.1.1/24   +| br-lan           | LAN & WiFi          | 192.168.1.1/24          
-vlan0 (eth0.0)   EXAMPLE LAN ports (1 to 4)   EXAMPLE None             +lan1-4           | LAN ports (1-4)     br-lan                  
-vlan1 (eth0.1)   EXAMPLE WAN port             EXAMPLE DHCP             | +wan              | WAN port            | DHCP                    |
-| wl0              | EXAMPLE WiFi                 | EXAMPLE Disabled         | +
- +
-</WRAP>+
  
 ==== Switch Ports (for VLANs) ==== ==== Switch Ports (for VLANs) ====
-<WRAP BOX> 
-FIXME Please fill in real values for this device, then remove the EXAMPLEs 
  
-Numbers 0-3 are Ports 1-4 as labeled on the unit, number 4 is the Internet (WAN) on the unit, 5 is the internal connection to the router itself. Don't be fooled: Port 1 on the unit is number 3 when configuring VLANs. vlan0 = eth0.0, vlan1 = eth0.1 and so on. 
 ^ Port             ^ Switch port   ^ ^ Port             ^ Switch port   ^
-| Internet (WAN)   EXAMPLE 4     +| Internet (WAN)   wan           
-| LAN 1            | EXAMPLE 3     +| LAN 1            | lan1          
-| LAN 2            | EXAMPLE 2     +| LAN 2            | lan2          
-| LAN 3            | EXAMPLE 1     +| LAN 3            | lan3          
-| LAN 4            | EXAMPLE 0     | +| LAN 4            | lan4          |
- +
-</WRAP>+
  
 ==== Buttons ==== ==== Buttons ====
 -> [[docs:guide-user:hardware:hardware.button]] on howto use and configure the hardware button(s). -> [[docs:guide-user:hardware:hardware.button]] on howto use and configure the hardware button(s).
 Here, we merely name the buttons, so we can use them in the above Howto. Here, we merely name the buttons, so we can use them in the above Howto.
- 
-<WRAP BOX> 
-FIXME Please fill in real values for this device, then remove the EXAMPLEs 
  
 The Etisalat S3 has the following buttons: The Etisalat S3 has the following buttons:
  
-^ BUTTON                       ^ Event   ^ +^ BUTTON        ^ Event   ^ 
-EXAMPLE Reset                |  reset  | +| Reset    |  reset  | 
-EXAMPLE Secure Easy Setup      ses   | +WPS       wps    |
-| EXAMPLE No buttons at all.      -    |+
  
-</WRAP> 
  
 ===== Hardware ===== ===== Hardware =====
 ==== Info ==== ==== Info ====
-<WRAP BOX> 
-FIXME 
-  - This table is automatically generated, **once the correct filters for Brand and Model are set.** 
-  - If you see "Nothing." instead of a table, please **edit this section and adjust the filters with the proper Brand and Model.** Just try, it's easy. 
-  - If you still don't see a table here, or a table filled with '¿': [[toh:start|Is there already a Techdata page available]] for Etisalat S3 ? If not: [[meta:create_new_dataentry_page|Create one]]. 
-  - If you see a table with the desired device data, everything is OK and you can delete this text and the ''<nowiki><WRAP></nowiki>'' that encloses it. 
-  - If it still doesn't work: Don't panic, calm down, take a deep breath and [[:contact|contact a wiki admin]] (tmomas) for help. 
-</WRAP> 
  
 ---- datatemplatelist dttpllist ---- ---- datatemplatelist dttpllist ----
Line 275: Line 313:
 filter  : Brand=Etisalat filter  : Brand=Etisalat
 filter  : Model=S3 filter  : Model=S3
-filter  : Versions= 
 ---- ----
  
Line 297: Line 334:
 **Note:** This will void your warranty! **Note:** This will void your warranty!
  
-<WRAP BOX> +There are 2 crews behind the rubber feet. There are also clips around the edge of the case you will need to prize open, using, for example, plastic card. 
-FIXME //Describe what needs to be done to open the device, e.g. remove rubber feet, adhesive labels, screws, ...// + 
-  * To remove the cover and open the devicedo a/b/c +{{media:rostelecom:rt-sf-1_case_opening.jpg?400|Rostelecom RT-SF-1 case opening}}
-</WRAP>+
  
 //Main PCB://\\ //Main PCB://\\
Line 308: Line 344:
 -> [[docs:techref:hardware:port.serial]] general information about the serial port, serial port cable, etc. -> [[docs:techref:hardware:port.serial]] general information about the serial port, serial port cable, etc.
  
-How to connect to the Serial Port of this specific device:\\ +How to connect to the Serial Port of the Etisalat S3:\\ 
-**Insert photo of PCB with markings for serial port**+{{media:beeline:smartbox-turbo_pcb_serial.jpg?400|Beeline SmartBox TURBO UART connection}}
  
-<WRAP BOX> +You need to connect R53 and R54 pins (marked red on the photo). For example using the solder
-FIXME //Replace EXAMPLE by real values.// + 
-</WRAP>+^ Serial connection parameters\\ for Etisalat S3 | 57600, 8N1, 3.3V |
  
-^ Serial connection parameters\\ for Etisalat S3 @@Version@@ | EXAMPLE 115200, 8N1, 3.3V | 
  
 ==== JTAG ==== ==== JTAG ====
Line 343: Line 378:
  
 ===== Notes ===== ===== Notes =====
-//Space for additional notes, links to forum threads or other resources.// 
- 
-  * ... 
  
 +=== OpenWrt community builds (unofficial) ===
 +  * [[https://forum.openwrt.org/t/add-support-for-beeline-smartbox-giga/99390/4|Community builds]]
 ===== Tags ===== ===== Tags =====
-<WRAP BOX> 
-FIXME //Add tags below, then remove this fixme.// 
-</WRAP> 
  
-[[meta:tags|How to add tags]] +{{tag>U-boot 2core ramips mediatek MT7621 GigabitEthernet 1NIC 5Port 2WNIC wlan 802.11abgn 802.11a 802.11bgn 802.11ac mt7603 mt7615 InternalAntenna 4Ant 128NAND 256RAM USB3.0 USB 1USB Serial GPIO 2button 12v_powered etisalat sercomm S3 Dual_firmware}}
-{{tag>EXAMPLETAG}}+
  • Last modified: 2024/09/05 19:04
  • by csharper2005