|
|
This article is available in: English ChineseGB Deutsch Francais Italiano Russian Turkce |
by Dr.B. Thangaraju <balasubramanian.thangaraju(at)wipro.com> ��������: B. Thangaraju��ʿ��ӡ��̩�׶��ɵ°�İ����ٴ�É��ѧ�������������ѧ��ʿ�ƺţ���Ϊӡ�ȿ�ѧԺ�� ��������5�ꡣ��������ڽ���������͸�����籡Ĥ�������ȷֽ⣬����ѧ��������ϵ����P-��N-ԾǨ(����) ���������� ������Ӱ��Ĺ������ڿ��Ϸ�����10ƪ���£�����������7�ι��ʹ��ڻ����Ϸ������Լ����о����� ��Ŀǰ��ְλ��ӡ��Wipro Technologies��˾��������չ�����������ڵ��о�ѧϰ��֪ʶ����������Linux�� �ˣ��豸������ʵʱLinux�� Ŀ¼: |
ÕªÒª:
��д�豸������һ��������ս�Ժ�ð���ԵĹ��������豸ͨ��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�˿ڡ������������Ӧ����ȷ�������ģ����豸ʹ�õĶ˿ڵ�ַ�Ƕ�ռ�ġ� �κ������豸������ʹ����ε�ַ��Χ��Ϊ��ȷ����㣬��������Ӧ��������ε�ַ�Ƿ���ʹ�ã����������� ��ε�ַδ��ʹ��ʱ�����������ں�Ϊ�豸������ε�ַ��
���������õĶ˿�(��ַ)��Χ��ͨ������ĺ���
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>��#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"); }
__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);
void insb(unsigned int port�� void *addr�� unsigned long
count);
void outsb(unsigned int port�� void *addr�� unsigned long
count);
void insw(unsigned int port�� void *addr�� unsigned long
count);
void outsw(unsigned int port�� void *addr�� unsigned long
count);
void insl(unsigned int port�� void *addr�� unsigned long
count);
void outsl(unsigned int port�� void *addr�� unsigned long
count);
|
��ҳ��LinuxFocus�à¼ï¿½ï¿½Î¬ï¿½ï¿½
© Dr.B. Thangaraju, FDL LinuxFocus.org ���������LinuxFocus�������������� |
������Ϣ:
|
2003-04-06, generated by lfparser version 2.25