
<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://armadeus.org/wiki/index.php?action=history&amp;feed=atom&amp;title=Ftdi_fixer.py</id>
		<title>Ftdi fixer.py - Revision history</title>
		<link rel="self" type="application/atom+xml" href="http://armadeus.org/wiki/index.php?action=history&amp;feed=atom&amp;title=Ftdi_fixer.py"/>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Ftdi_fixer.py&amp;action=history"/>
		<updated>2026-04-07T11:56:52Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.26.3</generator>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Ftdi_fixer.py&amp;diff=14606&amp;oldid=prev</id>
		<title>FabienM at 14:33, 20 July 2018</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Ftdi_fixer.py&amp;diff=14606&amp;oldid=prev"/>
				<updated>2018-07-20T14:33:19Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;tr style='vertical-align: top;' lang='en'&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 14:33, 20 July 2018&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot; &gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Sources from [https://ycc.io/scripts/ftdi_fixer.py here]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;&amp;#160;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#!/usr/bin/python&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;#!/usr/bin/python&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>FabienM</name></author>	</entry>

	<entry>
		<id>http://armadeus.org/wiki/index.php?title=Ftdi_fixer.py&amp;diff=14605&amp;oldid=prev</id>
		<title>FabienM: Created page with &quot;&lt;pre&gt; #!/usr/bin/python # vim: set ts=4 sw=4 expandtab syntax=python: &quot;&quot;&quot;  FTDI device permission fixer  Can be called from a udev rule to ensure connected FTDI devices have w...&quot;</title>
		<link rel="alternate" type="text/html" href="http://armadeus.org/wiki/index.php?title=Ftdi_fixer.py&amp;diff=14605&amp;oldid=prev"/>
				<updated>2018-07-20T14:32:56Z</updated>
		
		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;pre&amp;gt; #!/usr/bin/python # vim: set ts=4 sw=4 expandtab syntax=python: &amp;quot;&amp;quot;&amp;quot;  FTDI device permission fixer  Can be called from a udev rule to ensure connected FTDI devices have w...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/python&lt;br /&gt;
# vim: set ts=4 sw=4 expandtab syntax=python:&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
FTDI device permission fixer&lt;br /&gt;
&lt;br /&gt;
Can be called from a udev rule to ensure connected FTDI devices have&lt;br /&gt;
world-writable permissions for use by user applications&lt;br /&gt;
&lt;br /&gt;
J. Hipps &amp;lt;jacob@ycnrg.org&amp;gt;&lt;br /&gt;
https://ycnrg.org/&lt;br /&gt;
&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import os&lt;br /&gt;
import sys&lt;br /&gt;
import usb1&lt;br /&gt;
&lt;br /&gt;
def find_usb_device(vid, pid):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;locate usb device with libusb&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    usb = usb1.USBContext()&lt;br /&gt;
    for tdev in usb.getDeviceList():&lt;br /&gt;
        if tdev.getVendorID() == vid and tdev.getProductID() == pid:&lt;br /&gt;
            n_bus = tdev.getBusNumber()&lt;br /&gt;
            n_dev = tdev.getDeviceAddress()&lt;br /&gt;
            n_port = tdev.getPortNumber()&lt;br /&gt;
            return (n_bus, n_dev)&lt;br /&gt;
    return None&lt;br /&gt;
&lt;br /&gt;
def fix_dev_perms(bus, dev):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;fix perms for entry in /dev/bus&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    db_path = '/dev/bus/usb/%03d/%03d' % (bus, dev)&lt;br /&gt;
    try:&lt;br /&gt;
        os.stat(db_path)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(&amp;quot;Entry not accessible [%s]: %s&amp;quot; % (db_path, str(e)))&lt;br /&gt;
        return False&lt;br /&gt;
    try:&lt;br /&gt;
        os.chmod(db_path, 0o0666)&lt;br /&gt;
    except Exception as e:&lt;br /&gt;
        print(&amp;quot;Failed to update perms for %s: %s&amp;quot; % (db_path, str(e)))&lt;br /&gt;
        return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
def _main():&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;entry point&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if 'ID_VENDOR_ID' in os.environ and 'ID_MODEL_ID' in os.environ:&lt;br /&gt;
        try:&lt;br /&gt;
            d_vid = int(os.environ['ID_VENDOR_ID'], 16)&lt;br /&gt;
            d_pid = int(os.environ['ID_MODEL_ID'], 16)&lt;br /&gt;
        except:&lt;br /&gt;
            print(&amp;quot;Failed to convert values from env&amp;quot;)&lt;br /&gt;
            sys.exit(2)&lt;br /&gt;
    else:&lt;br /&gt;
        if len(sys.argv) &amp;lt; 3:&lt;br /&gt;
            print(&amp;quot;usage: ftdi_fixer.py [VENDOR_ID PRODUCT_ID]&amp;quot;)&lt;br /&gt;
            sys.exit(1)&lt;br /&gt;
        try:&lt;br /&gt;
            d_vid = int(sys.argv[1], 16)&lt;br /&gt;
            d_pid = int(sys.argv[2], 16)&lt;br /&gt;
        except:&lt;br /&gt;
            print(&amp;quot;Failed to convert hex values&amp;quot;)&lt;br /&gt;
            sys.exit(2)&lt;br /&gt;
&lt;br /&gt;
    udev = find_usb_device(d_vid, d_pid)&lt;br /&gt;
&lt;br /&gt;
    if udev:&lt;br /&gt;
        fix_dev_perms(*udev)&lt;br /&gt;
    else:&lt;br /&gt;
        print(&amp;quot;Failed to locate device&amp;quot;)&lt;br /&gt;
        sys.exit(1)&lt;br /&gt;
    sys.exit(0)&lt;br /&gt;
&lt;br /&gt;
if __name__ == '__main__':&lt;br /&gt;
    _main()&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>FabienM</name></author>	</entry>

	</feed>