Beranda > Internet, teknologi > Nikmatnya Internetan Pakai Smart ZTE AC-2627

Nikmatnya Internetan Pakai Smart ZTE AC-2627

Impian menggunakan koneksi internet cepat nan murah tercapai sudah. Kalau sebelumnya kami menggunakan speedy telkom, namun banyak pengalaman tidak mengenakkan yang kami alami.

Kemudian kami beralih menggunakan modem HP Haier D1200P dari Smart Telecom. Kecepatan koneksinya dibawah telkom speedy, tapi waktu itu kami memperoleh koneksi gratisan 6 bulan, dimana per bulannya memperoleh 2GB data. Cukuplah buat kami yang hanya browsing ringan-ringan dan ngeblog. Yang menjadi masalah adalah kecepatan koneksinya yang tidak stabil. Kadang tidak bisa akses sama sekali. Kadang sangat cepat sekali.

Lalu tibalah modem USB ZTE AC-2627 ini. Gratisan 100 hari dengan jatah data maksimal: unlimited. Terserah anda. Mau youtube-an sepuasnya, monggo. Iklan di TV dengan kenyataannya lebih baik kenyataannya.🙂 Setelah 100 hari gratis berakhir, tarifnya juga kompetitif. Untuk kecepatan yang sama per hari sepuasnya hanya Rp. 10rb. Toh kami tidak mungkin tiap hari 24 jam konek internet. Kesimpulan: bisnis warnet mungkin bakal bangkrut jika Smart terus meluaskan jaringannya.

Yang lebih memuaskan lagi, kalau dulu pakai Haier harus bolak-balik ke windows-linux untuk men-“flush” modem baru bisa konek, sekarang dengan USB ZTE ini nggak perlu lagi. Hidupkan PC/laptop, masuk Linux, langsung konek.

Speed kami dari server Surabaya:

Yang ini ketika belum pakai Module Kernel option 3G, masih pakai usb serial biasa:

Smart ZTE Speedtest

Lalu ini ketika sudah pakai modul 3G :

Smart ZTE Speedtest

Cukup fair karena janji koneksi adalah UP TO 3.1 Mb/s. Kalau bisa 1 Mega lebih berarti minimal ada 3 orang untuk 3.1 Mb/s🙂 Padahal kecepatan segini sama dengan bandtwith 1 warnet kecil.

Update:

Speedtest jam 4 pagi :

Jadi = ISP Average (global)

Update 28 Desember 2009 :

Speedtest jam 6 pagi hari ini:

Ada rekan yang bilang kalau smart itu cepat awalnya saja, setelah beberapa waktu akan semakin lambat. Pengalaman kami menemukan hal berbeda=semakin cepat. Tembus 2.34 Mbps!

Hitungan ekonomi modem ZTE:

Harga Rp.1 juta

Gratis 3 bulan, katakanlah per bulan ikut koneksi lain yang udah terkenal Rp.150rb=total Rp.450rb. Jadi Rp.1 juta – Rp.450rb = Rp.550rb.

  1. Desember 23, 2009 pukul 3:58 am

    cara buat katifin modul 3G itu lewat linux ato lewat wind*ws ? kalau mengaktifkannya di ‘jendela ‘ memakai driver bawaanya ato dipatch?? kalo aktifkan di linux bagaimana?? thank buat pencerahannya.

    UO:
    a. kami pakai linux, jadi mengaktifkan modul option di linux.
    b. kalau tidak salah begini:

    1. buat direktori sembarang, misalnya “option”,
    2. buat file text biasa, beri nama=option.c
    3. kopikan code bahasa c ini ke file text tadi :


    /*
    Option Card (PCMCIA to) USB to Serial Driver

    Copyright (C) 2005 Matthias Urlichs

    This driver is free software; you can redistribute it and/or modify
    it under the terms of Version 2 of the GNU General Public License as
    published by the Free Software Foundation.

    Portions copied from the Keyspan driver by Hugh Blemings

    History:

    2005-05-19 v0.1 Initial version, based on incomplete docs
    and analysis of misbehavior with the standard driver
    2005-05-20 v0.2 Extended the input buffer to avoid losing
    random 64-byte chunks of data
    2005-05-21 v0.3 implemented chars_in_buffer()
    turned on low_latency
    simplified the code somewhat
    2005-05-24 v0.4 option_write() sometimes deadlocked under heavy load
    removed some dead code
    added sponsor notice
    coding style clean-up
    2005-06-20 v0.4.1 add missing braces :-/
    killed end-of-line whitespace
    2005-07-15 v0.4.2 rename WLAN product to FUSION, add FUSION2
    2005-09-10 v0.4.3 added HUAWEI E600 card and Audiovox AirCard
    2005-09-20 v0.4.4 increased recv buffer size: the card sometimes
    wants to send >2000 bytes.
    2006-04-10 v0.4.2 fixed two array overrun errors :-/

    Work sponsored by: Sigos GmbH, Germany

    */

    #define DRIVER_VERSION "v0.4"
    #define DRIVER_AUTHOR "Matthias Urlichs "
    #define DRIVER_DESC "Option Card (PC-Card to) USB to Serial Driver"

    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include
    #include "usb-serial.h"

    /* Function prototypes */
    static int option_open(struct usb_serial_port *port, struct file *filp);
    static void option_close(struct usb_serial_port *port, struct file *filp);
    static int option_startup(struct usb_serial *serial);
    static void option_shutdown(struct usb_serial *serial);
    static void option_rx_throttle(struct usb_serial_port *port);
    static void option_rx_unthrottle(struct usb_serial_port *port);
    static int option_write_room(struct usb_serial_port *port);

    static void option_instat_callback(struct urb *urb, struct pt_regs *regs);

    static int option_write(struct usb_serial_port *port,
    const unsigned char *buf, int count);

    static int option_chars_in_buffer(struct usb_serial_port *port);
    static int option_ioctl(struct usb_serial_port *port, struct file *file,
    unsigned int cmd, unsigned long arg);
    static void option_set_termios(struct usb_serial_port *port,
    struct termios *old);
    static void option_break_ctl(struct usb_serial_port *port, int break_state);
    static int option_tiocmget(struct usb_serial_port *port, struct file *file);
    static int option_tiocmset(struct usb_serial_port *port, struct file *file,
    unsigned int set, unsigned int clear);
    static int option_send_setup(struct usb_serial_port *port);

    /* Vendor and product IDs */
    #define OPTION_VENDOR_ID 0x0AF0
    #define HUAWEI_VENDOR_ID 0x12D1
    #define AUDIOVOX_VENDOR_ID 0x0F3D
    #define ZTE_PRODUCT_AC2726 0xfff1
    #define ZTE_VENDOR_ID 0x19d2

    #define OPTION_PRODUCT_OLD 0x5000
    #define OPTION_PRODUCT_FUSION 0x6000
    #define OPTION_PRODUCT_FUSION2 0x6300
    #define HUAWEI_PRODUCT_E600 0x1001
    #define AUDIOVOX_PRODUCT_AIRCARD 0x0112

    static struct usb_device_id option_ids[] = {
    { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_OLD) },
    { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION) },
    { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) },
    { USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
    { USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) },
    { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726) },
    { } /* Terminating entry */
    };

    MODULE_DEVICE_TABLE(usb, option_ids);

    static struct usb_driver option_driver = {
    .name = "option",
    .probe = usb_serial_probe,
    .disconnect = usb_serial_disconnect,
    .id_table = option_ids,
    .no_dynamic_id = 1,
    };

    /* The card has three separate interfaces, which the serial driver
    * recognizes separately, thus num_port=1.
    */
    static struct usb_serial_driver option_3port_device = {
    .driver = {
    .owner = THIS_MODULE,
    .name = "option",
    },
    .description = "Option 3G data card",
    .id_table = option_ids,
    .num_interrupt_in = NUM_DONT_CARE,
    .num_bulk_in = NUM_DONT_CARE,
    .num_bulk_out = NUM_DONT_CARE,
    .num_ports = 1, /* 3, but the card reports its ports separately */
    .open = option_open,
    .close = option_close,
    .write = option_write,
    .write_room = option_write_room,
    .chars_in_buffer = option_chars_in_buffer,
    .throttle = option_rx_throttle,
    .unthrottle = option_rx_unthrottle,
    .ioctl = option_ioctl,
    .set_termios = option_set_termios,
    .break_ctl = option_break_ctl,
    .tiocmget = option_tiocmget,
    .tiocmset = option_tiocmset,
    .attach = option_startup,
    .shutdown = option_shutdown,
    .read_int_callback = option_instat_callback,
    };

    #ifdef CONFIG_USB_DEBUG
    static int debug;
    #else
    #define debug 0
    #endif

    /* per port private data */

    #define N_IN_URB 4
    #define N_OUT_URB 1
    #define IN_BUFLEN 4096
    #define OUT_BUFLEN 128

    struct option_port_private {
    /* Input endpoints and buffer for this port */
    struct urb *in_urbs[N_IN_URB];
    char in_buffer[N_IN_URB][IN_BUFLEN];
    /* Output endpoints and buffer for this port */
    struct urb *out_urbs[N_OUT_URB];
    char out_buffer[N_OUT_URB][OUT_BUFLEN];

    /* Settings for the port */
    int rts_state; /* Handshaking pins (outputs) */
    int dtr_state;
    int cts_state; /* Handshaking pins (inputs) */
    int dsr_state;
    int dcd_state;
    int ri_state;

    unsigned long tx_start_time[N_OUT_URB];
    };

    /* Functions used by new usb-serial code. */
    static int __init option_init(void)
    {
    int retval;
    retval = usb_serial_register(&option_3port_device);
    if (retval)
    goto failed_3port_device_register;
    retval = usb_register(&option_driver);
    if (retval)
    goto failed_driver_register;

    info(DRIVER_DESC ": " DRIVER_VERSION);

    return 0;

    failed_driver_register:
    usb_serial_deregister (&option_3port_device);
    failed_3port_device_register:
    return retval;
    }

    static void __exit option_exit(void)
    {
    usb_deregister (&option_driver);
    usb_serial_deregister (&option_3port_device);
    }

    module_init(option_init);
    module_exit(option_exit);

    static void option_rx_throttle(struct usb_serial_port *port)
    {
    dbg("%s", __FUNCTION__);
    }

    static void option_rx_unthrottle(struct usb_serial_port *port)
    {
    dbg("%s", __FUNCTION__);
    }

    static void option_break_ctl(struct usb_serial_port *port, int break_state)
    {
    /* Unfortunately, I don't know how to send a break */
    dbg("%s", __FUNCTION__);
    }

    static void option_set_termios(struct usb_serial_port *port,
    struct termios *old_termios)
    {
    dbg("%s", __FUNCTION__);

    option_send_setup(port);
    }

    static int option_tiocmget(struct usb_serial_port *port, struct file *file)
    {
    unsigned int value;
    struct option_port_private *portdata;

    portdata = usb_get_serial_port_data(port);

    value = ((portdata->rts_state) ? TIOCM_RTS : 0) |
    ((portdata->dtr_state) ? TIOCM_DTR : 0) |
    ((portdata->cts_state) ? TIOCM_CTS : 0) |
    ((portdata->dsr_state) ? TIOCM_DSR : 0) |
    ((portdata->dcd_state) ? TIOCM_CAR : 0) |
    ((portdata->ri_state) ? TIOCM_RNG : 0);

    return value;
    }

    static int option_tiocmset(struct usb_serial_port *port, struct file *file,
    unsigned int set, unsigned int clear)
    {
    struct option_port_private *portdata;

    portdata = usb_get_serial_port_data(port);

    if (set & TIOCM_RTS)
    portdata->rts_state = 1;
    if (set & TIOCM_DTR)
    portdata->dtr_state = 1;

    if (clear & TIOCM_RTS)
    portdata->rts_state = 0;
    if (clear & TIOCM_DTR)
    portdata->dtr_state = 0;
    return option_send_setup(port);
    }

    static int option_ioctl(struct usb_serial_port *port, struct file *file,
    unsigned int cmd, unsigned long arg)
    {
    return -ENOIOCTLCMD;
    }

    /* Write */
    static int option_write(struct usb_serial_port *port,
    const unsigned char *buf, int count)
    {
    struct option_port_private *portdata;
    int i;
    int left, todo;
    struct urb *this_urb = NULL; /* spurious */
    int err;

    portdata = usb_get_serial_port_data(port);

    dbg("%s: write (%d chars)", __FUNCTION__, count);

    i = 0;
    left = count;
    for (i=0; left > 0 && i OUT_BUFLEN)
    todo = OUT_BUFLEN;

    this_urb = portdata->out_urbs[i];
    if (this_urb->status == -EINPROGRESS) {
    if (time_before(jiffies,
    portdata->tx_start_time[i] + 10 * HZ))
    continue;
    usb_unlink_urb(this_urb);
    continue;
    }
    if (this_urb->status != 0)
    dbg("usb_write %p failed (err=%d)",
    this_urb, this_urb->status);

    dbg("%s: endpoint %d buf %d", __FUNCTION__,
    usb_pipeendpoint(this_urb->pipe), i);

    /* send the data */
    memcpy (this_urb->transfer_buffer, buf, todo);
    this_urb->transfer_buffer_length = todo;

    this_urb->dev = port->serial->dev;
    err = usb_submit_urb(this_urb, GFP_ATOMIC);
    if (err) {
    dbg("usb_submit_urb %p (write bulk) failed "
    "(%d, has %d)", this_urb,
    err, this_urb->status);
    continue;
    }
    portdata->tx_start_time[i] = jiffies;
    buf += todo;
    left -= todo;
    }

    count -= left;
    dbg("%s: wrote (did %d)", __FUNCTION__, count);
    return count;
    }

    static void option_indat_callback(struct urb *urb, struct pt_regs *regs)
    {
    int err;
    int endpoint;
    struct usb_serial_port *port;
    struct tty_struct *tty;
    unsigned char *data = urb->transfer_buffer;

    dbg("%s: %p", __FUNCTION__, urb);

    endpoint = usb_pipeendpoint(urb->pipe);
    port = (struct usb_serial_port *) urb->context;

    if (urb->status) {
    dbg("%s: nonzero status: %d on endpoint %02x.",
    __FUNCTION__, urb->status, endpoint);
    } else {
    tty = port->tty;
    if (urb->actual_length) {
    tty_buffer_request_room(tty, urb->actual_length);
    tty_insert_flip_string(tty, data, urb->actual_length);
    tty_flip_buffer_push(tty);
    } else {
    dbg("%s: empty read urb received", __FUNCTION__);
    }

    /* Resubmit urb so we continue receiving */
    if (port->open_count && urb->status != -ESHUTDOWN) {
    err = usb_submit_urb(urb, GFP_ATOMIC);
    if (err)
    printk(KERN_ERR "%s: resubmit read urb failed. "
    "(%d)", __FUNCTION__, err);
    }
    }
    return;
    }

    static void option_outdat_callback(struct urb *urb, struct pt_regs *regs)
    {
    struct usb_serial_port *port;

    dbg("%s", __FUNCTION__);

    port = (struct usb_serial_port *) urb->context;

    if (port->open_count)
    schedule_work(&port->work);
    }

    static void option_instat_callback(struct urb *urb, struct pt_regs *regs)
    {
    int err;
    struct usb_serial_port *port = (struct usb_serial_port *) urb->context;
    struct option_port_private *portdata = usb_get_serial_port_data(port);
    struct usb_serial *serial = port->serial;

    dbg("%s", __FUNCTION__);
    dbg("%s: urb %p port %p has data %p", __FUNCTION__,urb,port,portdata);

    if (urb->status == 0) {
    struct usb_ctrlrequest *req_pkt =
    (struct usb_ctrlrequest *)urb->transfer_buffer;

    if (!req_pkt) {
    dbg("%s: NULL req_pkt\n", __FUNCTION__);
    return;
    }
    if ((req_pkt->bRequestType == 0xA1) &&
    (req_pkt->bRequest == 0x20)) {
    int old_dcd_state;
    unsigned char signals = *((unsigned char *)
    urb->transfer_buffer +
    sizeof(struct usb_ctrlrequest));

    dbg("%s: signal x%x", __FUNCTION__, signals);

    old_dcd_state = portdata->dcd_state;
    portdata->cts_state = 1;
    portdata->dcd_state = ((signals & 0x01) ? 1 : 0);
    portdata->dsr_state = ((signals & 0x02) ? 1 : 0);
    portdata->ri_state = ((signals & 0x08) ? 1 : 0);

    if (port->tty && !C_CLOCAL(port->tty) &&
    old_dcd_state && !portdata->dcd_state)
    tty_hangup(port->tty);
    } else {
    dbg("%s: type %x req %x", __FUNCTION__,
    req_pkt->bRequestType,req_pkt->bRequest);
    }
    } else
    dbg("%s: error %d", __FUNCTION__, urb->status);

    /* Resubmit urb so we continue receiving IRQ data */
    if (urb->status != -ESHUTDOWN) {
    urb->dev = serial->dev;
    err = usb_submit_urb(urb, GFP_ATOMIC);
    if (err)
    dbg("%s: resubmit intr urb failed. (%d)",
    __FUNCTION__, err);
    }
    }

    static int option_write_room(struct usb_serial_port *port)
    {
    struct option_port_private *portdata;
    int i;
    int data_len = 0;
    struct urb *this_urb;

    portdata = usb_get_serial_port_data(port);

    for (i=0; i out_urbs[i];
    if (this_urb && this_urb->status != -EINPROGRESS)
    data_len += OUT_BUFLEN;
    }

    dbg("%s: %d", __FUNCTION__, data_len);
    return data_len;
    }

    static int option_chars_in_buffer(struct usb_serial_port *port)
    {
    struct option_port_private *portdata;
    int i;
    int data_len = 0;
    struct urb *this_urb;

    portdata = usb_get_serial_port_data(port);

    for (i=0; i out_urbs[i];
    if (this_urb && this_urb->status == -EINPROGRESS)
    data_len += this_urb->transfer_buffer_length;
    }
    dbg("%s: %d", __FUNCTION__, data_len);
    return data_len;
    }

    static int option_open(struct usb_serial_port *port, struct file *filp)
    {
    struct option_port_private *portdata;
    struct usb_serial *serial = port->serial;
    int i, err;
    struct urb *urb;

    portdata = usb_get_serial_port_data(port);

    dbg("%s", __FUNCTION__);

    /* Set some sane defaults */
    portdata->rts_state = 1;
    portdata->dtr_state = 1;

    /* Reset low level data toggle and start reading from endpoints */
    for (i = 0; i in_urbs[i];
    if (! urb)
    continue;
    if (urb->dev != serial->dev) {
    dbg("%s: dev %p != %p", __FUNCTION__,
    urb->dev, serial->dev);
    continue;
    }

    /*
    * make sure endpoint data toggle is synchronized with the
    * device
    */
    usb_clear_halt(urb->dev, urb->pipe);

    err = usb_submit_urb(urb, GFP_KERNEL);
    if (err) {
    dbg("%s: submit urb %d failed (%d) %d",
    __FUNCTION__, i, err,
    urb->transfer_buffer_length);
    }
    }

    /* Reset low level data toggle on out endpoints */
    for (i = 0; i out_urbs[i];
    if (! urb)
    continue;
    urb->dev = serial->dev;
    /* usb_settoggle(urb->dev, usb_pipeendpoint(urb->pipe),
    usb_pipeout(urb->pipe), 0); */
    }

    port->tty->low_latency = 1;

    option_send_setup(port);

    return (0);
    }

    static inline void stop_urb(struct urb *urb)
    {
    if (urb && urb->status == -EINPROGRESS)
    usb_kill_urb(urb);
    }

    static void option_close(struct usb_serial_port *port, struct file *filp)
    {
    int i;
    struct usb_serial *serial = port->serial;
    struct option_port_private *portdata;

    dbg("%s", __FUNCTION__);
    portdata = usb_get_serial_port_data(port);

    portdata->rts_state = 0;
    portdata->dtr_state = 0;

    if (serial->dev) {
    option_send_setup(port);

    /* Stop reading/writing urbs */
    for (i = 0; i in_urbs[i]);
    for (i = 0; i out_urbs[i]);
    }
    port->tty = NULL;
    }

    /* Helper functions used by option_setup_urbs */
    static struct urb *option_setup_urb(struct usb_serial *serial, int endpoint,
    int dir, void *ctx, char *buf, int len,
    void (*callback)(struct urb *, struct pt_regs *regs))
    {
    struct urb *urb;

    if (endpoint == -1)
    return NULL; /* endpoint not needed */

    urb = usb_alloc_urb(0, GFP_KERNEL); /* No ISO */
    if (urb == NULL) {
    dbg("%s: alloc for endpoint %d failed.", __FUNCTION__, endpoint);
    return NULL;
    }

    /* Fill URB using supplied data. */
    usb_fill_bulk_urb(urb, serial->dev,
    usb_sndbulkpipe(serial->dev, endpoint) | dir,
    buf, len, callback, ctx);

    return urb;
    }

    /* Setup urbs */
    static void option_setup_urbs(struct usb_serial *serial)
    {
    int j;
    struct usb_serial_port *port;
    struct option_port_private *portdata;

    dbg("%s", __FUNCTION__);

    port = serial->port[0];
    portdata = usb_get_serial_port_data(port);

    /* Do indat endpoints first */
    for (j = 0; j in_urbs[j] = option_setup_urb (serial,
    port->bulk_in_endpointAddress, USB_DIR_IN, port,
    portdata->in_buffer[j], IN_BUFLEN, option_indat_callback);
    }

    /* outdat endpoints */
    for (j = 0; j out_urbs[j] = option_setup_urb (serial,
    port->bulk_out_endpointAddress, USB_DIR_OUT, port,
    portdata->out_buffer[j], OUT_BUFLEN, option_outdat_callback);
    }
    }

    static int option_send_setup(struct usb_serial_port *port)
    {
    struct usb_serial *serial = port->serial;
    struct option_port_private *portdata;

    dbg("%s", __FUNCTION__);

    portdata = usb_get_serial_port_data(port);

    if (port->tty) {
    int val = 0;
    if (portdata->dtr_state)
    val |= 0x01;
    if (portdata->rts_state)
    val |= 0x02;

    return usb_control_msg(serial->dev,
    usb_rcvctrlpipe(serial->dev, 0),
    0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT);
    }

    return 0;
    }

    static int option_startup(struct usb_serial *serial)
    {
    int i, err;
    struct usb_serial_port *port;
    struct option_port_private *portdata;

    dbg("%s", __FUNCTION__);

    /* Now setup per port private data */
    for (i = 0; i num_ports; i++) {
    port = serial->port[i];
    portdata = kzalloc(sizeof(*portdata), GFP_KERNEL);
    if (!portdata) {
    dbg("%s: kmalloc for option_port_private (%d) failed!.",
    __FUNCTION__, i);
    return (1);
    }

    usb_set_serial_port_data(port, portdata);

    if (! port->interrupt_in_urb)
    continue;
    err = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
    if (err)
    dbg("%s: submit irq_in urb failed %d",
    __FUNCTION__, err);
    }

    option_setup_urbs(serial);

    return (0);
    }

    static void option_shutdown(struct usb_serial *serial)
    {
    int i, j;
    struct usb_serial_port *port;
    struct option_port_private *portdata;

    dbg("%s", __FUNCTION__);

    /* Stop reading/writing urbs */
    for (i = 0; i num_ports; ++i) {
    port = serial->port[i];
    portdata = usb_get_serial_port_data(port);
    for (j = 0; j in_urbs[j]);
    for (j = 0; j out_urbs[j]);
    }

    /* Now free them */
    for (i = 0; i num_ports; ++i) {
    port = serial->port[i];
    portdata = usb_get_serial_port_data(port);

    for (j = 0; j in_urbs[j]) {
    usb_free_urb(portdata->in_urbs[j]);
    portdata->in_urbs[j] = NULL;
    }
    }
    for (j = 0; j out_urbs[j]) {
    usb_free_urb(portdata->out_urbs[j]);
    portdata->out_urbs[j] = NULL;
    }
    }
    }

    /* Now free per port private data */
    for (i = 0; i num_ports; i++) {
    port = serial->port[i];
    kfree(usb_get_serial_port_data(port));
    }
    }

    MODULE_AUTHOR(DRIVER_AUTHOR);
    MODULE_DESCRIPTION(DRIVER_DESC);
    MODULE_VERSION(DRIVER_VERSION);
    MODULE_LICENSE("GPL");

    #ifdef CONFIG_USB_DEBUG
    module_param(debug, bool, S_IRUGO | S_IWUSR);
    MODULE_PARM_DESC(debug, "Debug messages");
    #endif

    4. buat file “makefile” (masih di folder tsb) untuk persiapan kompilasi yg isinya:


    obj-m += option.o

    all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

    clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

    5. jalankan makefile di command line :

    make -C /lib/modules/`uname -r`/build SUBDIRS=`pwd` modules

    kami lupa sebagai root atau user biasa .. coba dulu pakai user biasa

    6. kalau berhasil (gcc harus terinstall), kopikan hasilnya yakni file “option.ko” ke folder “/lib/modules/nama kernel anda/kernel/drivers/usb/serial/” (kali ini harus sbg root)

    7. kalau distro anda (kami mandriva) hanya support akhiran “gz” untuk modul kernel, kompresslah dulu ke “gz” sebelum kopi ke folder “/lib/modules/nama kernel anda/kernel/drivers/usb/serial/” tsb

    8. jalankan perintah sebagai root
    modprobe option

    kalau sebelumnya masih terkonek dengan modul usbserial,
    remove dulu modul usbserial tsb dengan perintah :

    modprobe -r usbserial

    9. cek dmesg sudah terdetek atau tidak

    10. untuk afdolnya, ketikkan di rc.local atau (dimanapun biasanya anda) perintah “modprobe option” tadi spy nggak harus modprobe manual tiap mau konek.

    11.Update:
    mungkin mau coba option.ko.gz langsung ? siapa tau jalan, download dengan opera unite disini (kl kami sedang online, passwordnya : tebak aja, jelas kok)

    • putra
      Maret 20, 2011 pukul 2:03 pm

      klo untuk windows xp cra’na gmana…?

  2. bayu
    Januari 8, 2010 pukul 5:13 am

    ni linux apa yach ?q pke d windows 7 enak banget,tpi kalo di linux gak konek,q pke ubuntu remix for netbook,bisa gak di terapkan ?

    UO: insya’allah bisa, banyak yg pakai ubuntu berhasil, coba aja digoogling.

    • agus
      Januari 16, 2010 pukul 5:40 am

      @mas bayu: emang smart suport di windows 7 saya instal kok gak bisa apakah ada trik khusus untuk instalasinya mohon dikasih tau mas.makaSIH

  3. nayay18
    Januari 8, 2010 pukul 12:54 pm

    nice info…mw tax, cara ini juga bisa untuk modem merk lain y???

    UO: mungkin bisa, asal modem tsb juga support 3g, coba lihat komen yg dibawah …

    • bayu
      Januari 8, 2010 pukul 5:25 pm

      ane kira gk bisa,

      coz header d atas da tulisan ni
      /* Vendor and product IDs */
      #define OPTION_VENDOR_ID 0x0AF0
      #define HUAWEI_VENDOR_ID 0x12D1
      #define AUDIOVOX_VENDOR_ID 0x0F3D
      #define ZTE_PRODUCT_AC2726 0xfff1
      #define ZTE_VENDOR_ID 0x19d2

      jdi khusus zte 2627 ja

      UO: mungkin bisa, cari idproduct dan idvendornya pake perintah lsusb, trus coba aja ganti salah satunya dengan modem anda….itu yg kami lakukan kok🙂

  4. Januari 9, 2010 pukul 2:32 pm

    good…good…mupeng euy… (muka pengen …)

    UO: shh (smart hebat hemat) …

  5. haris
    Februari 9, 2010 pukul 6:59 am

    om untuk modul smart gw masih bingung tuh dengan tulisan2nya. tolong diperjelas..
    gw pake windows vista

    UO: kami pakai Linux, langkah2 diatas untuk Linux, bukan Windows Vista

  6. Tofan
    Februari 15, 2010 pukul 5:39 pm

    kl di windows xp pro,bisa gk y?bisa kirimkan k email sy?atau konfirmasi k email kl uda ada balesan mengenai pertnyaan sy.trims

    UO: yap, ini hanya buat linux ..

  7. Jan
    Februari 25, 2010 pukul 4:15 pm

    Om, kurang jelas, situ pakenya distro apa?? Saya pake opensuse, udah nyoba, kok ngga bisa ya?? mohon pencerahan..

  8. Jan
    Februari 25, 2010 pukul 4:30 pm

    @linux-207z:~/option> make -C /lib/modules/`uname -r`/build SUBDIRS=`pwd` modules
    make: *** /lib/modules/2.6.31.12-0.1-desktop/build: No such file or directory. Stop.

    UO: kami pakai Mandriva, dari error message diatas tertulis file yang diinginkan tidak ada.
    Ada dua kemungkinan: file tsb tidak ada atau folder tsb tidak ada. Cobalah sebagai root.
    Kami agak lupa disini. Sebgai user biasa atau root.

    Drop email disini [pakai disposable email] kalau mau kami kirim option.ko. thanks.

  9. andri
    April 3, 2010 pukul 7:40 am

    Sudah persis tapi kasusnya sama diatas. Pake Linux Mint 8 (Helena).

    sudo make -C /lib/modules/`uname -r`/build SUBDIRS=`pwd` modules
    make: Entering directory `/usr/src/linux-headers-2.6.31-20-generic’
    scripts/Makefile.build:44: /home/andri/option/Makefile: No such file or directory
    make[1]: *** No rule to make target `/home/andri/option/Makefile’. Stop.
    make: *** [_module_/home/andri/option] Error 2
    make: Leaving directory `/usr/src/linux-headers-2.6.31-20-generic’

    Help….

    UO: kebetulan baru pasang di ubuntu, jadi masih fresh: sudah instal linux-headers-2.6.31-20-generic ? Itu pesannya cukup jelas. kl belum file ini harus didownload dulu ke warnet terdekat🙂 jangan lupa kernel source dan (mungkin) paket build essential (dimana program ‘make’ biasanya ada disana).
    File makefile sudah dibuat juga ?
    Ohya, source bahasa C diatas sebaiknya gunakanlah source option.c yang ada di kernel anda sendiri karena tiap distro beda aturannya. Jadi jangan gunakan source bahasa c diatas karena source diatas untuk Mandriva.

    Catatan lain: siapa tahu kernel 2.6.31 sudah support ZTE ini, coba langsung modprobe option.

  10. sylva
    April 26, 2010 pukul 7:01 pm

    q pake dah 3 bulan lebih modem ac2627 ini,q ni maniak download tapi soal install gak begitu bisa,menurut anda,linux yg paling enak & paling mudah buat orang seperti q ini apa ?q ada fedora 12,ubuntu 9.10(alternate & netbook) sama xubuntu 9.10

    UO: blm pernah coba yg lainnya, tapi ubuntu cukup mudah, paket pendukung tersedia online, komunitas rame, dll.

  11. Juli 30, 2010 pukul 9:35 am

    Coba deh pakai mandriva …
    Untuk konek ke internetnya udah kaya windows…
    Lihat totorialnya di :
    http://mopheat.blogspot.com/2010/07/running-modem-zte-ac2726-in-mandriva.html

  12. Oktober 16, 2010 pukul 6:31 am
    /home/andri/option/Makefile’. Stop.
    

    penamaan file nya tuh, m sama M case sensitive🙂

  13. April 12, 2013 pukul 3:49 am

    Taks aya sangka ada pengguna Mandriva era 2009 membuat blog yang sangar seperti ini. Saya sangat terkesan ketika akang mengatakan

    kami pakai linux, jadi mengaktifkan modul option di linux.

  1. No trackbacks yet.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: