GNU/Linux >> Belajar Linux >  >> Linux

Cara mengontrol port periferal:Mengakses dan menulis di Port Paralel dengan C di Linux. Bagian I

Salah satu kasus penggunaan yang paling mencolok dan muncul untuk mengontrol port periferal pada PC adalah otomatisasi rumah, teknologi ini menawarkan berbagai kemungkinan yang tak terbatas di rumah kita. Otomasi Rumah adalah disiplin teknis dengan sisi sosial. Pendekatan kami adalah, menggunakan beberapa frase kunci, untuk meningkatkan kualitas hidup, memperluas komunikasi dan mengotomatisasi proses. Semua ini tampaknya cukup sederhana, tetapi kompleksitas yang melekat dalam dunia baru otomatisasi rumah ini menarik, mari kita lihat alasannya.

Otomasi Rumah adalah aktivitas yang kompleks karena beberapa alasan. Pertama, pengoperasian pada perangkat rumah (sensor, peralatan pintar, aktuator ...) memberi Anda gambaran tentang fenomena fisik yang rumit, seperti kuantum mekanik atau efek fotolistrik. Selain itu, salah satu perangkat ini dapat melakukan berbagai tugas dan tidak harus hanya yang sederhana. Kedua, berbicara tentang Otomasi Rumah berbicara tentang sistem yang terdiri dari banyak komponen berbeda yang tidak selalu berinteraksi dengan mudah (bayangkan sistem keamanan rumah yang mencakup kamera video, pendeteksi kehadiran, peralatan komunikasi, alarm dengan sistem peringatan jarak jauh, dll. ...). Terakhir, dan yang terpenting, kompleks karena menghadapi otomatisasi sistem teknis dengan sistem sosial.

Definisi Istilah

Port Paralel:

Port paralel adalah antarmuka antara komputer dan perangkat periferal, yang karakteristik utamanya adalah bit data berjalan bersama, mengirimkan paket byte pada suatu waktu. Jalur kabel atau fisik untuk setiap bit data diimplementasikan dengan membentuk bus 8 jalur. Melalui port paralel, kita juga dapat mengontrol periferal seperti lampu, motor, dan perangkat lainnya.

Antarmuka Web:

Antarmuka Web memungkinkan pengguna untuk mengontrol dan berinteraksi dengan perangkat mereka melalui browser web. Ini dapat digunakan untuk remote control, manajemen perpustakaan, umpan balik visual, dan banyak hal lainnya.

Otomasi Rumah:

Ini adalah otomatisasi semua sistem yang mampu mengotomatisasi rumah, menyediakan layanan manajemen energi, keamanan, kesejahteraan, dan komunikasi, serta dapat diintegrasikan dalam jaringan komunikasi dalam dan luar ruangan berkabel atau nirkabel.

Cara bekerja dengan Port Paralel di C

Untuk tujuan utama kami, otomatisasi rumah dasar, kami akan menggunakan port paralel untuk menunjukkan bagaimana kami dapat menulis (atau membaca) beberapa byte untuk mengontrol perangkat sederhana. Port paralel Jenis ECP PC memiliki konektor keluaran jenis DB25 betina yang diagram dan sinyalnya dapat dilihat pada gambar berikut:

Gambar 1:Diagram Port Paralel. Pinout konektor perempuan. Atas izin Wikipedia

Keluaran port paralel

Port paralel PC, menurut standar Centronics, terdiri dari bus komunikasi 8 bit data dua arah, ditambah satu set jalur untuk protokol. Jalur komunikasi memiliki penahan yang menyimpan nilai terakhir yang dituliskan sampai data baru ditulis, karakteristik kelistrikannya adalah:

  •      Tegangan tingkat tinggi:3,3 hingga 5V.
  •      Tegangan level rendah:0 V.
  •      Arus keluaran maksimum:2,6 mA.
  •      Arus input maksimum:24 mA.

Tegangan dan arus dapat memberi makan satu set perangkat kontrol seperti sakelar LED, Relay, dan Solid State. Buffer ini diperlukan untuk mematikan atau menghidupkan elemen dengan konsumsi daya yang lebih tinggi.

Mengalamatkan

Pengalamatan port paralel standar penting karena berbagai sumber daya yang digunakannya dari komputer dan untuk tujuan identifikasi. Port paralel standar menggunakan tiga alamat yang berdekatan, biasanya dalam salah satu rentang berikut:

3BCh 3BDh 3BEh
378j 379j 37Ah
278j 279j 27Ah


Alamat pertama dalam jangkauan adalah alamat dasar port, juga disebut register Data atau hanya alamat port. Alamat kedua adalah register Status port, dan yang ketiga adalah register Kontrol.

EPP dan ECP mencadangkan alamat tambahan untuk setiap port. EPP menambahkan lima register di alamat dasar + 3 melalui alamat dasar + 7, dan ECP menambahkan tiga register di alamat dasar + 400 jam melalui alamat dasar + 402 jam. Untuk alamat dasar 378h, register EPP berada pada 37Bh hingga 37Fh, dan register ECP berada pada 778h hingga 77Fh.

Saluran DMA

ECP dapat menggunakan akses memori langsung (DMA) untuk transfer data ke port paralel. Selama transfer DMA, CPU bebas melakukan hal lain, sehingga transfer DMA dapat menghasilkan kinerja yang lebih cepat secara keseluruhan. Untuk menggunakan DMA, port harus memiliki saluran DMA yang ditetapkan, dalam kisaran 0 hingga 3.

Mengakses Port Fisik di Linux

Karena perangkat keras port pada PC dikendalikan langsung oleh kernel Linux, kita harus mengakses header tertentu yang terkait dengan bus port paralel. Kompiler GCC dapat mengakses header ini, selalu diingat bahwa pengguna harus memiliki hak akses root untuk menghindari kesalahan akses. Header ini adalah:

  • stdio.h:"Header input-output standar" (header standar I/O) adalah file header yang berisi definisi makro, konstanta, deklarasi fungsi dalam pustaka standar bahasa pemrograman C untuk melakukan operasi, standar input dan output, serta definisi jenis yang diperlukan untuk operasi tersebut. Untuk alasan kompatibilitas, bahasa pemrograman C ++ (turunan C) juga memiliki implementasi sendiri dari fungsi-fungsi ini, yang dideklarasikan dengan header file cstdio. Fungsi yang harus saya gunakan adalah fprintf yang memungkinkan untuk mencetak pada jendela terminal jika ada kesalahan.
  • stdlib.h: Apakah file header untuk library standar bahasa pemrograman tujuan umum C. Ini berisi prototipe fungsi C untuk manajemen memori dinamis, kontrol proses, dan lainnya. Ini mendukung C ++ di mana ia dikenal sebagai cstdlib. Fungsi yang akan saya gunakan adalah exit ketika kita mendapatkan error
  • unistd.h: File header yang menyediakan akses ke API sistem operasi POSIX. Pada sistem mirip Unix, antarmuka yang didefinisikan oleh unistd.h biasanya sebagian besar terdiri dari fungsi pembungkus panggilan sistem seperti fork, pipa, dan primitif I/O (baca, tulis, tutup, dll.).
  • sys/io.h:Keluarga fungsi ini digunakan untuk melakukan input dan output port tingkat rendah. Fungsi out* melakukan output port, fungsi in* melakukan input port; fungsi b-suffix adalah byte-width dan fungsi w-suffix word-width; fungsi _p-suffix berhenti sampai I/O selesai. Dari fungsi keluarga ini saya akan menggunakan outb.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>

Di Linux, mudah untuk mengakses dan mengontrol port paralel, namun akses root harus sangat dipertimbangkan. Semua library di atas adalah library yang diperlukan untuk tutorial kita hari ini.

Mendefinisikan Alamat Memori untuk Port Paralel

Setelah menyertakan perpustakaan, kita harus menentukan alamat memori yang ditetapkan ke port paralel, seperti yang disebutkan di atas, alamat default untuk port paralel pertama adalah 0x378.

#define base 0x378           /* parallel port base address */

Jika Anda mengalami masalah saat mencoba alamat ini, Anda harus mencoba 0x278.

Menggunakan Bus Data sebagai Port Keluaran

Untuk tutorial bagian pertama ini saya akan menggunakan Bus Data sebagai Port keluaran. Pada bab berikutnya kita akan melihat bagaimana menggunakannya sebagai port untuk input data atau bahkan sebagai port campuran. Pada gambar di bawah ini kita dapat melihat kontrol dari sekumpulan 8 LED yang terhubung, melalui resistor pembatas arus, ke port paralel, yang merespons nilai yang ditetapkan ke alamat 0x378. Nilai resistor dapat bervariasi dari 100 Ohm hingga 300 Ohm, bagian ini penting karena kita dapat merusak port jika kita tidak membatasi arus.

Skematis


Catatan:Warna LED tidak penting.

Sirkuit Nyata



Perhatian:Harap berhati-hati dalam menangani konektor port paralel, berhati-hatilah pastikan Anda tidak memutuskan sirkuit sebelum mematikan PC. Hal ini dapat menyebabkan kerusakan pada port atau bahkan pada Motherboard. Kami tidak dapat mengasumsikan kerusakan apa pun yang dapat Anda sebabkan pada perangkat keras Anda.

Implementasi Perangkat Lunak

Untuk tujuan saya, saya akan menunjukkan cara menempatkan beberapa nilai di port, dan bagaimana pengaturan waktu nilai tersebut harus dilakukan, ini adalah rutinitas yang sangat sederhana untuk menunjukkan cara kerjanya.

Sekarang saya akan menjelaskan semua perintah dan kata-kata yang digunakan dalam perangkat lunak kontrol:

  • Langkah 1:Kondisikan jika pengguna memiliki izin root untuk mengakses port. Argumen untuk perintah bersyarat ini adalah ioperm yang menyetel bit izin akses port untuk basis alamat port.
if (ioperm(base,1,1))
  • Langkah 2:Jika pengguna tidak memiliki hak yang cukup untuk mengakses port paralel, kesalahan akses akan ditampilkan dan eksekusi program akan berakhir.
fprintf(stderr, "Access denied to %x\n", base), exit(1);
  • Langkah 3:Jika akses diberikan, loop for akan memberikan urutan hidup dan mati  ke LED dengan nilai yang telah ditentukan untuk ditampilkan di port. Fungsi pengaturan waktu yang saya gunakan adalah sleep() yang membuat utas panggilan tidur hingga detik dalam argumen telah berlalu.
        w=0;
        for (x=0; x=7; x++)  
            {        
            y=pow(2,w);
            outb(y, base);
            sleep(1);
            w=w+1;
               }


    Saat pemrosesan kode melewati jalur akses yang diizinkan,  'fprintf (stderr, "Access ditolak ke% x \ n", base), exit (1); ', pin data port paralel tersedia sesuai keinginan dan imajinasi Anda. Dalam kasus saya, saya hanya mengambil urutan sederhana dari led pertama hingga yang terakhir dengan interval satu detik, menggunakan kekuatan basis 2. (lihat tautan video). Namun, kemungkinannya tidak terbatas, pada kenyataannya, tanpa menggunakan multiplexing dapat mengontrol hingga 8 output independen, dengan multiplexing output dapat tumbuh hingga 255 kemungkinan. Bergantung pada aplikasinya, baik dalam hal otomatisasi rumah, kami dapat menangani  port tanpa multiplexing, menempatkan buffer yang sesuai untuk menangani beban arus yang lebih tinggi, yang akan dibahas nanti di tutorial lain.


    Referensi:

    Martin H, Saez F. Domotica, Un Enfoque Sociotécnico. Juni 2006. Fundación Rogelio Segovia para el Desarrollo de las Telecomunicaciones, Ciudad Universitaria, s/n 28040-Madrid, ISBN:84-7402-335-1.

    Port Paralel Axelson J. Selesai. Pemrograman, Antarmuka, &Menggunakan Port Printer Paralel PC. Amazon INC..  ISBN:0-9650819-1-5

    Kerrisk M. Antarmuka Pemrograman Linux. Proyek halaman manual Linux. ISBN 978-1-59327-220-3


    Linux
    1. Flatpak di Linux:Apa Itu dan Bagaimana Menginstal Aplikasi dengannya

    2. Cara Zip File dan Direktori di Linux (dengan Contoh)

    3. Cara Memeriksa Port Terbuka di Linux dengan netstat, lsof, dan nmap

    1. Cara Menemukan File Dengan Izin SUID dan SGID di Linux

    2. Cara Bekerja Dengan Pengguna Dan Grup Di Linux

    3. Membaca dan menulis ke port serial di C di Linux

    1. Cara membuka dan menutup port di RHEL 8 / CentOS 8 Linux

    2. Cara Menonton Port TCP dan UDP secara Real-time

    3. Bagaimana saya bisa memeriksa port mana yang sibuk dan port mana yang kosong di mesin Linux saya?