[LinuxFocus-icon]
��ҳ  |  վ���ͼ  |  ����  |  ����

���� | �����ڿ� | ���� | ����LF
This article is available in: English  ChineseGB  Deutsch  Francais  Italiano  Russian  Turkce  

[Photo of the Author]
by Dr.B. Thangaraju
<balasubramanian.thangaraju(at)wipro.com>

��������:
B. Thangaraju��ʿ��ӡ��̩�׶��ɵ°�İ����ٴ�ɭ��ѧ�������������ѧ��ʿ�ƺţ���Ϊӡ�ȿ�ѧԺ�� ��������5�ꡣ��������ڽ���������͸�����籡Ĥ�������ȷֽ⣬����ѧ��������ϵ����P-��N-ԾǨ(����) ��������о��� ������Ӱ��Ĺ������ڿ��Ϸ�����10ƪ���£�����������7�ι��ʹ��ڻ����Ϸ������Լ����о�����

��Ŀǰ��ְλ��ӡ��Wipro Technologies��˾��������չ�����������ڵ��о�ѧϰ��֪ʶ����������Linux�� �ˣ��豸������ʵʱLinux��
Ŀ¼:

 

linux�豸�����İ�ȫ�˿ڷ���

[Illustration]

ÕªÒª:

��д�豸������һ��������ս�Ժ�ð���ԵĹ��������豸ͨ��init_module�����Ǽ�ʱ���豸����ԴӦ������ �䡣һ����Ҫ���豸��Դ��I/O�˿ڡ���Ϊ��̬���ӵ��������򣬿�����Ӧ��С�Ľ�δ��ʹ�õ�I/O�˿ڷ��� ����Щ�豸�� ������������Ӧ�����Щ�˿��Ƿ�ʹ�û��ͷš�Ȼ����Ϊ�豸�����ȡ�˿ڡ�������ģ�鱻 ���ں����Ƴ�ʱ���˿�Ӧ�ñ��ͷš���ƪ����������Linux�豸�����İ�ȫ�˿ڷ���ĸ����ԡ�



 

����

�豸����������һ����Ҫ���ĵ��������豸����Դ���䡣��Щ��Դ����I/O�˿ڣ��ڴ���жϡ���ƪ������ ͼ����I/O��ϵͳ�Ļ���ԭ������Դ�������Ҫ�ԣ���Ҫ��I/O�˿ڵ���Դ������ͬʱ�������������⣬�� ����ͷ��豸�Ķ˿ڵ�ַ��

������Ӳ��Ԫ�أ���˿ڣ����ߺ��豸�������������˴����IJ�ͬ��I/O�豸���豸������I/O��ϵͳ�ṩ�� һ��ͨ�õ��豸��ȡ���棬��dz�������ϵͳ����(systmem call)��Ӧ�ó���Ͳ���ϵͳ֮���ṩ�ı�׼�� �档�����кܶ������͵��豸�����ڵ����ϣ�����˵����: �洢�豸������̣��Ŵ�������������; �˻��� ���豸������̣�������Ļ; �����豸���������͵��ƽ������������Щ��ͬ�豸����Ŀ�޴�����ֻ�� Ҫ����һЩ�����ĸ�����豸��μ����Լ�������ο���Ӳ����

 

��������

�豸����������ɣ�һ���DZ����豸Ϊ�������ĵ������֣���һ���ǻ�е���֡�������ͨ��ϵͳ���߼��ص� �����ϡ����͵ķ�ʽ�ǣ�һ�黥����ͻ�ļĴ����鱻���赽������������I/O�˿ڰ���4��Ĵ�������״̬�� ���������ƼĴ�������������Ĵ�������������Ĵ�����״̬�Ĵ���ӵ�п��Ա�������ȡ��(״̬)λ������ ָʾ��ǰ�����Ƿ�ִ����ϣ������ֽ��Ƿ���Ա�������д�룬�Լ��κδ�����ʾ�����ƼĴ���������д ����������һ��������߸ı��豸��(����)ģʽ����������Ĵ������ڻ�ȡ�������������Ĵ����������� ���ͽ����

���ԣ����������豸֮��Ļ��������ǿ��ƺ�״̬�Ĵ�������������ִ�г������������豸��ص�ָ�� ʱ����ͨ������Ӧ���豸����һ��������ִ�и�ָ�������ִ����Ҫ��Ķ���������״̬�Ĵ������ض�λ�� Ȼ�����ȴ��������������μ���豸��״ֱ̬�����ֲ�����ɡ����粢����������(��ӡ��ʹ�õ�)һ��� ��ѯ��ӡ����֪����ӡ���Ƿ�׼���á������ӡ��û��׼���ã����������˯��һ��ʱ��(��������ʱ������ �����õĹ���)���ù��̽��ظ�ֱ����ӡ��׼���á�������ѯ�Ļ����ܹ��Ľ�ϵͳ�����ܡ�����һ�ַ�ʽ���� ϵͳ���в���Ҫ��"����"(unnecessarily waiting)�������κ����õĹ�����

�Ĵ���ӵ����I/O�ռ���ȷ����ĵ�ַ��Χ��ͨ����Щ��ַ������ʱ�����䣬ʹ��һ���������ļ��ж��� �IJ����������豸�ĵ�ַ��Χ���ܱ�Ԥ���䣬����豸�Ǿ�̬���صġ�����ζ�ں˰������Ѵ����豸������ �����Է����I/O�˿��ܱ������ProcĿ¼�¡��������ϵͳʹ����Щ�豸ʱ��ͨ�����С�cat /proc/ioports�� ����ͬ���ļ������ʹ�õĵ�ַ��Χ����һ�������ʾ�˶˿ڵķ�Χ���ڶ�������ӵ����Щ�˿ڵ��豸��һ Щ����ϵͳ�߱�������ʱ��̬�����豸����ģ������ԡ������κ��µ��豸����ͨ����̬����ģ����ϵͳ���� ʱ���ص�ϵͳ�У������ܹ������ƺͷ��ʡ�

�豸�����ĸ����Ƿdz�����IJ��Ҵ���һ̨��������������������Ͳ㡣����ֱ�ӵ��豸��Ӳ�����Ե��� �ơ�ÿ���豸������ֻ����һ�ֵ�һ���͵��豸����Щ���Ϳ������ַ��ͣ����豸�ͻ������͡����һ��Ӧ�� �������豸�����������Ҫ���ں˻���ϵ����Ӧ���豸�������豸�����������ض����豸��������豸�� ����һ���������ϣ����������������ڣ�������open��close��read��write��ioctl��llseek �ȡ�������� ���ģ��ʱ��init_module ( ) �����ᱻ���ã���ģ�鱻�Ƴ�ʱ��cleanup_module ( ) �����ᱻ���á��豸���� �豸������init_module ( ) �����б��Ǽǵġ�

���豸�� init_module ( ) �еǼ�ʱ���豸����Դ��I/O�˿ڣ��ڴ���жϺ�Ҳ��������������䣬��Ҳ �����������ܹ���ȷ�����豸����Ҫ�������������κδ�����ڴ��ַ��ϵͳ����ʾ������Ϣsegmentation fault�� ������I/O�˿ڣ�ϵͳ��������κ�����wrong I/O port����Ϣ������ָ���κ������豸��ʹ�õĶ� �ڽ������ϵͳ�����������Ƴ�ģ��ʱ���豸Ӧ����ע������ȷ�е�˵�������豸���ź���Դ����cleanup_module ( ) �� ���б��ͷ�

�豸������Ƶ���Ĺ���ʱ��дIO�˿ڡ������������Ӧ����ȷ�������ģ����豸ʹ�õĶ˿ڵ�ַ�Ƕ�ռ�ġ� �κ������豸������ʹ����ε�ַ��Χ��Ϊ��ȷ����㣬��������Ӧ��������ε�ַ�Ƿ���ʹ�ã����������� ��ε�ַδ��ʹ��ʱ�����������ں�Ϊ�豸������ε�ַ��

 

��ȫ�˿ڷ���

�����������������ͨ��ϵͳ�����������Դ�������Դ�ͷš������ʵ�� ����linux 2��4�ں��Ͻ���ʵ��ģ����µ�����ʵ�ֽ�������Linux����ϵͳ��ij Щ��չ��Unix���֡�

���������õĶ˿�(��ַ)��Χ��ͨ������ĺ���

int check_region (unsigned long start�� unsigned long len);

��������0��ʾ�˿ڵ�ַ���ã�����С����򸺵Ĵ������( -EBUSY or -EINVAL) ��ʾ����ʹ���С���������2������: start �� �������򣨻�I/O�˿ڷ�Χ������ʼֵ����len�������ڵĶ˿���Ŀ��

���˿ڿ���ʱ��Ӧ�ý���������豸��ͨ��request_region ������

struct resource *request_region (unsigned long start�� unsigned long len�� char *name);

ͷ��������������ǰ�濴����һ�����ַ�ָ�����name��Ҫ����˿� ��ַ���豸���ơ���������ָ��resource�ṹ��ָ�롣Resource�ṹ���� ������Դ�ķ�Χ��������<linux/ioport��h>�� �ṹ�ĸ�ʽ��������

struct resource {
        const char *name;
        unsigned long start�� end;
        unsigned long flags;
        struct resource *parent�� *sibiling�� *child;
};
��ģ����ں��Ƴ�ʱ���˿�Ӧ�����ͷ��Ա�Ϊ�����豸ʹ�ã�Ϊ�������� cleanup_module ( )�� ʹ��release_region ( ) ������ �������﷨����

void release_region ( unsigned long start�� unsigned long len);

���������Ľ��ͺ�ǰ��һ�¡� ���ϵ�3������ʵ�����Ǻ궨�壬������<linux/ioport��h>��  

�豸�˿ڷ����������������

����ij���˵���˶�̬�����豸�Ķ˿ڷ��������
#include <linux/fs��h��>
#include <linux/ioport��h��>

struct file_operations fops;
unsigned long start�� len;

int init_module (void)
{
 int status;
 start = 0xff90;
 len   = 0x90;

 register_chrdev(254��"your_device"��&fops);

 status =  check_region (start�� len);
 if (status == 0) {
     printk ("The ports are available in that range��\n");
     request_region(start��len��"your_device");
 } else {
     printk ("The ports are already in use�� Try other range��\n");
     return (status);
 }
 return 0;
}

void cleanup_module (void)
{
 release_region(start�� len);
 printk (" ports are freed successfully\n");
 unregister_chrdev(254��"your_device");}
 printk (" your device is unregistered\n");
}

Ϊ�˱�����������Ӵ�����ȥ���˴�����ͺ���(�豸)�ŵĶ�̬���䡣 ���˿ڷ���ɹ�ʱ�����ǿ�����procĿ¼�м��:
$cat /proc/ioports  

����������ں�I/O�˿ں���ѡ��

Linux֧�ֲ�ͬλ���Ķ˿ں���������I/O�˿ڵĶ�д���˿ڿ�����8λ��16λ��32λ��Linux���� ��ͷ�ļ�<asm/io��h>�����˷���I/O�˿ڵ�����(inline)���������ڶ�ȡ(inx)��д��(outx) 8λ��16λ�Լ�32λ�˿ڡ���Щ������



__u8 inb (unsigned int port);
void outb (__u8 data�� unsigned int port);

__u16 inw (unsigned int port);
void outw(__u16 data�� unsigned int port);

__u32 inl (unsigned int prot);
void outl (__u32 data�� unsigned int port);


��Щ�����Ĵ��汾(string versions)�������ڵ�λʱ���ڸ���Ч�Ĵ���һ������ �����ݣ�ͨ�����º���


void insb(unsigned int port�� void *addr�� unsigned long count);
void outsb(unsigned int port�� void *addr�� unsigned long count);


addr �DZ�����򴫳����ڴ浥Ԫ��ַ��count�DZ����䵥Ԫ�������� Data ���DZ���ȡ�� д�뵽"port"�˿ڵ����ݡ�


void insw(unsigned int port�� void *addr�� unsigned long count);
void outsw(unsigned int port�� void *addr�� unsigned long count);

��16λ�˿ڶ�д16λ����


void insl(unsigned int port�� void *addr�� unsigned long count);
void outsl(unsigned int port�� void *addr�� unsigned long count);

��32λ�˿ڶ�д32���  

��л

����ʮ�ָ�лӡ��Wipro Technologies��˾��������չ���� Jayasurya V��������Ϊ������ָ������Ķ�����  

�ο�

 

����ƪ���·�������

ÿƪ���¶��и��Եķ���ҳ�档�����ҳ����������ύ���ۣ�Ҳ���Բ鿴�������ߵ����ۣ�
 ï¿½ï¿½ï¿½ï¿½Ò³ï¿½ï¿½ 

��ҳ��LinuxFocus�༭��ά��
© Dr.B. Thangaraju, FDL
LinuxFocus.org

���������LinuxFocus��������������
������Ϣ:
en --> -- : Dr.B. Thangaraju <balasubramanian.thangaraju(at)wipro.com>
en --> zh: Bruce Zhao <makeidea(at)21cn.com>

2003-04-06, generated by lfparser version 2.25